OpenGL中未显示照明

Lighting not appearing in OpenGL

本文关键字:照明 显示 OpenGL      更新时间:2023-10-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;
}

我缺少照明是因为与纹理冲突吗?无论我如何改变这种常态,我都不会得到任何照明。

我认为您正在尝试将预编程着色器opengl和着色器开放gl结合在一起。我建议学习如何通过使用尽可能多的着色器代码来实现照明

BennyBox有一个很棒的关于OpenGL的youtube系列,涵盖着色器和引擎设计

这是他的git repo和java版本。