【发布时间】:2015-04-18 20:03:16
【问题描述】:
我一直在尝试为我的 OpenGL 项目实现光照,但到目前为止我还没有获得任何光照效果。
我知道很多事情都可能出错,所以我尝试硬编码我的法线(并且只使用了几个三角形),但我仍然没有得到任何东西。
在我的场景中,我有一些物体沿着 0,0,0 的“地面”放置,希望能看到从上方照射下来的光线。它们有一个非常基本的纹理,很容易显示它们是否被点亮。
我这样初始化我的场景:
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glShadeModel(GL_SMOOTH);
glEnable(GL_COLOR_MATERIAL);
glTranslatef(0,0,0);
GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 0.2f };
GLfloat diffuseLight[] = { 0.8f, 0.8f, 0.8, 1.0f };
GLfloat specularLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat position[] = {0, 100.0f, 0, 1.0f };
glLightModelfv(GL_AMBIENT, ambientLight);
glLightModelfv(GL_DIFFUSE, ambientLight);
glLightModelfv(GL_SPECULAR, specularLight);
glLightModelfv(GL_POSITION, position);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glColorMaterial( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE );
GLfloat shine [] = {50};
GLfloat diffuse[] = {1.0f, 0.f, 0.f, 1.0f};
GLfloat spec[] = {1.0f, 0.f, 0.f, 1.0f};
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,spec);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS,shine);
当我去渲染时:
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, tiles[x]->image.width(), tiles[x]->image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tiles[x]->image.bits());
glNormal3d(0,1,0); //Will eventually calculate
glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawArrays(GL_TRIANGLES, 3, 3);
“Tiles”只是我的一类,它为我的对象保存图像和相应的向量。被调用的“顶点”只是一个向量列表(因此每个对象有 6 个向量 = 2 个三角形。
我的片段着色器:
uniform sampler2D texture;
in vec4 gl_Color;
in vec2 varyingTextureCoordinate;
out vec4 fragColor;
void main(void)
{
fragColor = texture2D(texture, varyingTextureCoordinate);
}
还有我的顶点着色器:
uniform mat4 mvpMatrix;
in vec4 vertex;
in vec2 textureCoordinate;
out vec2 varyingTextureCoordinate;
void main(void)
{
varyingTextureCoordinate = textureCoordinate;
gl_Position = mvpMatrix * vertex;
}
我的光照不足是因为与纹理冲突吗?无论我如何改变这种常态,我都没有得到任何照明。
【问题讨论】:
-
这是固定功能和着色器代码的公然混合,没有说明着色器是什么,发MCVE。
-
哎呀,我的意思是要包括我的着色器,现在把它们放上去。
-
也剩下,意在摆脱它。那是在我真正学会如何自己计算法线向量之前。它不会导致问题
-
我认为您正在尝试在这里组合预编程着色器 opengl 和着色器打开 gl。我建议学习如何通过使用尽可能多的着色器代码来实现光照。我强烈建议你看看this github repo 和他的youtube series
-
@lightice11 谢谢,这实际上以几种不同的方式帮助了我!如果您愿意,请将其发布为答案,我会接受 - 我真的只是不知道如何使用着色器,但现在我掌握了它。
标签: c++ opengl graphics lighting normals