3

我有一个没有纹理的三角形网格,但是有一个固定的颜色(蓝色)和 alpha(0.7f)。该网格是运行时生成的,并且法线是正确的。我发现在打开照明的情况下,我的对象的颜色会随着它在关卡中移动而发生变化。另外,灯光看起来也不对。当我绘制这个对象时,这是代码:

glEnable( GL_COLOR_MATERIAL );
float matColor[] = { cur->GetRed(), cur->GetGreen(), cur->GetBlue(), cur->GetAlpha() };
float white[] = { 0.3f, 0.3f, 0.3f, 1.0f };
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matColor);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, white);

我注意到的另一件奇怪的事情是,当我禁用GL_FRONT_AND_BACK并仅使用GL_FRONTor时,照明会失败GL_BACK。这是我的照明设置(在渲染器开始时完成一次):

m_lightAmbient[] = { 0.2f, 0.2f, 0.2f, 1.0f };
m_lightSpecular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
m_lightPosition[] = { 0.0f, 1200.0f, 0.0f, 1.0f };

glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient);
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition);

编辑:我做了很多工作来使法线“更”正确(因为我自己生成了表面),但是对象的颜色仍然会根据它的位置而变化。为什么是这样?openGL 是否有一些我不知道的特殊环境混合?

编辑:原来颜色变化是因为以前的纹理在纹理堆栈上,即使它没有被绘制,glMaterialfv也正在与它混合。

4

8 回答 8

1

如果在禁用 GL_FRONT_AND_BACK 时您的照明失败,则您的法线可能会被翻转。

于 2008-11-07T14:14:06.270 回答
1

你能发布初始化OpenGL的代码吗?您是说所有其他网格都绘制得很完美?你是同时渲染它们吗?

于 2008-11-07T17:12:04.273 回答
1

@对斯图史密斯的回应:

Z 测试不会帮助您处理透明三角形,您还需要每个三角形的 alpha 排序。如果您有一个对象在任何时候都可能有重叠的三角形面向相机(一个凹面对象),您必须首先绘制最远的三角形以确保正确执行混合,因为 Z 测试不考虑透明度。考虑这两个重叠(和透明)的三角形,并考虑在绘制那个小的重叠区域时会发生什么,无论是否进行 Z 测试。您可能会得出这样的结论:绘图顺序确实很重要。透明度很烂:P

    /\    /\
   /  \  /  \
  /    \/    \
 /     /\     \
/_____/__\_____\

我不相信这是您的问题,但是在处理部分透明的对象时,您需要考虑 alpha 排序。

于 2008-11-10T09:31:00.880 回答
1

原来颜色变化是因为之前的纹理在纹理堆栈上,即使它没有被绘制,glMaterialfv 也在与它混合。

于 2019-11-20T06:38:25.060 回答
0

如果您的三角形是 alpha 混合的,您是否不必从相机按 z 顺序对脸部进行排序?否则,您可能会在前面的面之上渲染对象后面的面。

于 2008-11-07T14:39:14.987 回答
0

@sebastion:多个绘图调用,每个对象都有一个 glDrawArrays。有些是有纹理的,有些是彩色的,都带有法线。gl 初始化代码是:glMatrixMode(GL_MODELVIEW);

// Vertices!
glEnableClientState(GL_VERTEX_ARRAY);

// Depth func
glEnable(GL_DEPTH_TEST);
glDepthFunc( GL_LESS );

// Enable alpha blending
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Lighting
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, m_lightAmbient);
glLightfv(GL_LIGHT0, GL_SPECULAR, m_lightSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, m_lightPosition);

// Culling
glDisable( GL_CULL_FACE );
// Smooth Shading
glShadeModel(GL_SMOOTH);

m_glSetupDone = true;

在此之后,我设置了一些相机,但那是完全标准的,投影模式,平截头体,模型视图,查看,翻译。

于 2008-11-10T08:54:14.840 回答
0

你确定你的法线是标准化的吗?如果没有,并且您通过 glNormal 调用指定法线,您可以尝试让 OpenGL 为您进行标准化,请记住,应该避免这种情况,但您可以对其进行测试:

glEnable(GL_NORMALIZE);

这样你就告诉 OpenGL 重新缩放通过 glNormal 提供的所有法线向量。

于 2009-01-05T14:08:15.673 回答
0

我的地形显示存在透明度问题,从某个角度看时,斜坡看起来是透明的。它仅在着色器中启用照明时发生。原来我没有开启深度测试,从某个角度看,地形被其他地形覆盖,显示为半透明。

TLDR;检查您是否启用了深度测试,将其关闭可能会在涉及照明时产生类似透明的效果。 https://learnopengl.com/Advanced-OpenGL/Depth-testing

于 2019-11-19T02:12:02.653 回答