2008-11-07 65 views
2

我有一个三角形网格,没有纹理,但设置的颜色(蓝色)和alpha(0.7f)。这个网格是运行时间生成的,法线是正确的。我发现,随着照明的开启,我的物体的颜色会随着它的移动而变化。此外,照明看起来不正确。当我得出这样的对象,这是代码:OpenGL中的照明问题

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_FRONT或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与它混合。

回答

1

如果在GL_FRONT_AND_BACK被禁用时灯光失效,则可能会翻转法线。

+0

但肯定会然后它只能使用GL_FRONT或GL_BACK中的一个......它不会。 – DavidG 2008-11-07 15:18:32

0

如果你的三角形是阿尔法混合的,你不需要按相机的z顺序排序你的面部吗?否则,您可能会在正面的脸部上方渲染物体背面的脸部。

+0

它是1对该对象的绘制调用,并且z测试是...对于游戏中的其他网格(半透明纹理球)完美工作,但是此特定网格无法正常工作。这与其他人之间有很多不同之处,通过所有选项:S – DavidG 2008-11-07 14:41:50

1

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

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; 

此后我有一些相机设置,但这完全标准,投影模式,截锥体,modelview,看看,翻译。

+0

我禁用背面剔除这里只是为了测试 – DavidG 2008-11-10 09:52:03

1

@应答到stusmith:

Z-测试将不会帮助你透明的三角形,你需要每三角阿尔法排序了。如果您有一个物体在任何时候都可能有重叠的三角形面向相机(凹形物体),则必须先绘制最远的三角形以确保混合正确执行,因为Z测试不考虑透明度。 考虑这两个重叠的(和透明的)三角形,并考虑在绘制这个小的重叠区域时会发生什么,有或没有Z-测试。实际上,您可能会得出结论,绘图顺序确实很重要。透明度很糟糕:P

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

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

+0

我已经去了禁用透明度的长度。仍然没有照明。 :S – DavidG 2008-11-10 09:48:47

0

你确定你的法线是正常化? 要是你没有通过glNormal调用指定法线,你可以尝试让OpenGL的做归你,记住,这应该是可以避免的,但你可以测试一下:

glEnable(GL_NORMALIZE); 

这样你告诉OpenGL重新调整通过glNormal提供的所有法向量。