Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 我的地没有亮_Opengl - Fatal编程技术网

Opengl 我的地没有亮

Opengl 我的地没有亮,opengl,Opengl,我有点被灯光卡住了。我的灯光可以照亮网格,但不能照亮我的地面 这是我的一些代码 灯光: glEnable(GL_LIGHT0); glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f); glEnable(GL_COLOR_MATERIAL); GLfloat ambient_light0[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat position_light0[] = { 0.0f, 8.0f, 0.0f,

我有点被灯光卡住了。我的灯光可以照亮网格,但不能照亮我的地面

这是我的一些代码

灯光:

glEnable(GL_LIGHT0);

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);
glEnable(GL_COLOR_MATERIAL);


GLfloat ambient_light0[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position_light0[] = { 0.0f, 8.0f, 0.0f, 0.9f };


GLfloat spotDirection_light0[] = {0.0, -1.0, 0.0 };
GLfloat specularLightcolor[] = { 1.0, 1.0, 1.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, position_light0 );
glLightfv( GL_LIGHT0, GL_SPOT_DIRECTION, spotDirection_light0 );
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.5);

glLightfv( GL_LIGHT0, GL_AMBIENT, ambient_light0 );
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLightcolor);

glLightf( GL_LIGHT0, GL_SPOT_CUTOFF, 60.0f );
glLightf( GL_LIGHT0, GL_SPOT_EXPONENT, 50.0f );
理由:

void drawGround(int id) {

glEnable(GL_TEXTURE_2D);

glEnable(GL_COLOR_MATERIAL);



getTexture(id);

glBindTexture(GL_TEXTURE_2D, id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);



GLfloat material_diffuse[] = {0.9, 0.9, 0.9, 1.0 };

    GLfloat material_specular[] = { 1, 1, 1, 1 };



glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material_diffuse);

glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);


glBegin(GL_QUADS); 



for(int i = 0; i<3; i++){

    for(int j= 0; j<3; j++){

    glNormal3f(0.0f, 1.0f, 0.0f);

    glMaterialfv(GL_FRONT, GL_DIFFUSE, material_diffuse);

        glMaterialfv(GL_FRONT, GL_SPECULAR, material_specular);

        glMaterialf(GL_FRONT, GL_SHININESS, 80.0);



    glTexCoord2f(1, 1);

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));

    glTexCoord2f(1, 0);     

    glVertex3f(-floorSize +((j)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0,0);  

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i+1)*(2*floorSize)/3));

    glTexCoord2f(0, 1);     

    glVertex3f(-floorSize +((j+1)*(2*floorSize)/3), 0 ,-floorSize +((i)*(2*floorSize)/3));


    }

}


glDepthMask( 1.0 );

glDisable(GL_TEXTURE_2D);

glEnd();

}
void图纸(内部id){
glEnable(GL_纹理_2D);
glEnable(GL_颜色_材料);
getTexture(id);
glBindTexture(GL_纹理_2D,id);
glTexParameteri(GL_纹理2D、GL_纹理最小过滤器、GL_线性);
glTexParameteri(GL_纹理2D、GL_纹理MAG_过滤器、GL_线性);
GLfloat material_diffuse[]={0.9,0.9,0.9,1.0};
GLfloat material_specular[]={1,1,1,1};
GLMATERIALV(GL_前部和后部、GL_漫反射、材质_漫反射);
GLMATERALEV(GL_前部和后部、GL_镜面反射、材料镜面反射);
glBegin(GL_QUADS);

对于(int i=0;i而言,问题在于,默认的固定函数OpenGL lighting仅在顶点处进行照明,然后仅插值结果颜色。由于地面的所有4个顶点都是暗淡的,因此整个四边形变暗

解决方案:

  • 进一步细分您的地面,以便有更多的灯光采样点。到目前为止,您只有3×3个点,这还不够。请考虑100×100甚至更多,以获得良好的照明效果

  • 使用片段着色器实现每像素照明
顺便说一句,你遇到了一个典型的OpenGL新手陷阱

更新:


另请注意:您也没有为平面提供法线。因此,照明根本不起作用。

不支持GLNORMA3F(0.0f、1.0f、0.0f);提供法线?@ettan:当然可以。傻我,我没有注意到。但是你不能在glBegin/glEnd块中切换材质参数。我的建议:根本不要使用立即模式。使用顶点数组。我已经将地面细分为100x100,但没有任何成功。甚至尝试了1000x1000,没有任何区别。@ettan:你能发布你的完整信息吗某个地方的源代码?例如,在pastbin.com。我想修改一下你的代码来找出问题所在。@ettan:虽然你增加了瓷砖的数量,但没有将每个瓷砖的大小减小到分辨率,即密度没有增加–在我这样做之后,我得到了很好的照明。我尽可能地修复了代码:我认为整个事情都是g我想让你们(学生)来做一个练习。让我告诉你们:这看起来像是某个助手被赋予了指导一些学生的任务;那个家伙复制了一些指导代码,并在其中填充了他自己关于这些齿轮如何匹配的错误想法。我个人强烈质疑课程的质量。