c++ - 光照没有出现在 OpenGL 中

标签 c++ opengl graphics lighting normals

我一直在尝试为我的 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”只是我的一个类,它为我的对象保存图像和相应的 vector 。被调用的“顶点”只是一个 vector 列表(因此每个对象有 6 个 vector = 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 和着色器 open gl。我建议学习如何通过使用尽可能多的着色器代码来实现光照

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

这是他的 git repojava version .

关于c++ - 光照没有出现在 OpenGL 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28573135/

相关文章:

java - 如何在不损失图像边缘质量的情况下旋转 ImageView

c++ - 将 32 位遗留代码移植到 64 位时如何处理不断变化的数据类型大小?

android - “pm install”命令在Android上无效

c++ - 我如何读取文件的最后一行

c++ - 子弹物理盒不旋转

ios - SDL 和 iOS main() 方法冲突

c++ - 如何更改qlist中颜色的值

java - OpenGL 中的字体度量

opengl - 在立方体贴图中跨摄像机渲染点 Sprite

java - JFrame 中的自定义绘图不显示