2

したがって、問題は、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))

各頂点の色については、法線をダミーカラーとして使用していました。これは、テクスチャを統合するための1つのステップにすぎなかったためです。テクスチャは自己生成されたものであり、基本的に値は次のものからのものです。

   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とマテリアルおよびライトのさまざまな組み合わせを試すことによるものでした。

    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 +マテリアル+ライト+テクスチャ)が最終的な色/影/光沢効果にどのように影響するかについて、ある種の公式はありますか?

4

1 に答える 1

1

ここで他の質問にシェーダーを使用している場合OpenGLシェーダーの質問

答えは、シェーダーで照明を処理していないため、シェーダーを有効にすると固定機能の照明ルーチンが無効になるということです。

私がこの結論に飛びつき、シェーダーなしで物事を見ている場合は、お詫び申し上げます。

編集

はい、公式があります。それはオレンジ色の本で広範囲にカバーされており、赤い本http://glprogramming.com/red/chapter05.htmlで簡単にカバーされています。赤い本の古いバージョンは無料で入手できます。

基本的に、それはオブジェクトのテクスチャに依存します。色があるかどうか、およびそれがどのように適用、変調、追加、乗算されるかによって異なります。マテリアルとそれがさまざまな色の光をどのように反射するか、およびマテリアルが生成する放出(放出のために暗いステッカーマテリアルで光ると考えてください)、およびライトの色とライトが顔に当たる角度。「シャイニー」は、光の鏡面反射に由来します。

于 2011-06-09T14:53:29.420 に答える