OpenGL - 纹理如何影响阴影/闪电?

时间:2011-06-09 08:23:27

标签: opengl pyopengl

所以问题是:当我从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)如何影响最终的颜色/阴影/光泽效果?

1 个答案:

答案 0 :(得分:1)

如果您在其他问题中使用着色器OpenGL shaders questions

然后答案是你没有处理着色器中的灯光,当您启用着色器时,它会禁用固定功能的灯光例程。

如果我在这个结论上跳了起来,你看到没有着色器的东西,我道歉。

修改

是的,有一个公式。它在橙皮书中有详细介绍,并在红皮书http://glprogramming.com/red/chapter05.html中简要介绍。旧版本可以免费获得红色书籍。

基本上,它取决于对象的纹理,是否有颜色以及如何应用,调制,添加,相乘。材料以及它如何反射不同颜色的光线,以及材料制作的任何效果(想想在黑暗的贴纸材料中发光以进行发射),以及光线的颜色和光线照射到脸部的角度。 “闪亮”来自光的镜面反射。