所以问题是:当我从ColorPointers切换到Textures时,似乎闪电/阴影效果大大减少了。我找到但解决不了的一些解决方案是设置glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR)。还有什么我可以做的更接近效果,没有纹理我会得到什么?
这是我启动灯光/场景的方式:
glClearColor (0.0, 0.0, 0.0, 0.5); # Black Background
glClearDepth (1.0); # Depth Buffer Setup
glDepthFunc(GL_LEQUAL) # The Type Of Depth Testing
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH); # Select Smooth Shading
glColor4f(0.90, 6.0, 6.0, 1.0)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
#glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0)
glEnable(GL_COLOR_MATERIAL);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [0.8, 0.8, 0.7, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 30)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR );
glLightfv(GL_LIGHT0, GL_POSITION, [0.85, 0.8, 0.75, 0])
glLightfv(GL_LIGHT0, GL_AMBIENT, [0.8, 0.8, 0.7, 0])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glLightfv(GL_LIGHT0, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
并为实际绘图。
glEnableClientState(GL_VERTEX_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferVertices)
glVertexPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_NORMAL_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferNormals)
glNormalPointer(GL_FLOAT, 0, None)
#glEnableClientState(GL_COLOR_ARRAY)
#glColorPointer(3, GL_FLOAT, 0, None)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
glBindBufferARB(GL_ARRAY_BUFFER_ARB, self.bufferTextureIndex)
glTexCoordPointer(1, GL_FLOAT, 0, None);
glBindTexture(GL_TEXTURE_1D, self.texture)
glEnable(GL_TEXTURE_1D)
glDrawElements(GL_TRIANGLES, len(self.triangles) , GL_UNSIGNED_SHORT, ADT.voidDataPointer(self.triangles))
对于每个顶点的颜色,我使用法线作为虚拟颜色,因为这只是整合纹理的一个步骤。纹理是自生成的,基本上值来自:
def getColor(self, value):
if value < 0:
return [1, 0, 0]
if value >=0 and value < 0.8:
return [1, 0.5, 0]
if value >= 0.8 and value < 1:
return [1, 1, 0]
if value >=1 and value < 1.2:
return [0.5, 1, 0]
if value >=1.2 and value < 1.4:
return [0, 1, 0]
if value >= 1.4 and value < 1.6:
return [0, 1, 0.5]
if value >= 1.6 and value < 1.8:
return [0, 1, 1]
if value >= 1.8 and value < 2:
return [0, 0.5, 1]
if value >= 2:
return [0, 0, 1]
实际创作:
glBindTexture(GL_TEXTURE_1D, self.texture)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, 190, 0, GL_RGB , GL_FLOAT, textureArray)
此致 波格丹
修改
好的,我接近了我想要的效果,但纯粹是通过尝试glColor4f与材料和ligths的不同组合。
glColor4f(2.2, 2.2, 2.2, 1.0)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0)
glEnable(GL_COLOR_MATERIAL)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, [0.6, 0.6, 0.6, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, [0.6, 0.6, 0.6, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, [0.8, 0.8, 0.8, 1.0])
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, 30)
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
glLightModeli( GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR )
glLightfv(GL_LIGHT0, GL_POSITION, [0, -10, -400, 0])
glLightfv(GL_LIGHT0, GL_AMBIENT, [0, 0, 0, 0])
glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.7, 0.7, 0.7, 0])
glLightfv(GL_LIGHT0, GL_SPECULAR, [0.8, 0.8, 0.8, 0])
是否有某种公式表明所有这些(glColor4f + Materials + Lights + Texture)如何影响最终的颜色/阴影/光泽效果?
答案 0 :(得分:1)
如果您在其他问题中使用着色器OpenGL shaders questions
然后答案是你没有处理着色器中的灯光,当您启用着色器时,它会禁用固定功能的灯光例程。
如果我在这个结论上跳了起来,你看到没有着色器的东西,我道歉。
是的,有一个公式。它在橙皮书中有详细介绍,并在红皮书http://glprogramming.com/red/chapter05.html中简要介绍。旧版本可以免费获得红色书籍。
基本上,它取决于对象的纹理,是否有颜色以及如何应用,调制,添加,相乘。材料以及它如何反射不同颜色的光线,以及材料制作的任何效果(想想在黑暗的贴纸材料中发光以进行发射),以及光线的颜色和光线照射到脸部的角度。 “闪亮”来自光的镜面反射。