2

私は XCode で実行し、OpenGL ES 1.1 を使用しています。1 つはテクスチャ付きで、もう 1 つはカラー データを含む単なる三角形であり、テクスチャ付きの三角形をレンダリングするまで正常にレンダリングされますが、他のクラスもテクスチャ付きになります私のスプライトアトラスの奇妙な部分で、テクスチャ座標がまったくありません

-(void) renderWithUpdate {

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

//Translate
glTranslatef(tranlation.x, tranlation.y, tranlation.z);

//Scale
glScalef(scale.x, scale.y, scale.z);

//Rotate
glRotatef( angleGeo, 1.0, 1.0, 0.0);


angleGeo = angleGeo + 0.5;
//NSLog(@"Rotation Angle:%F", (float)angleGeo );

glVertexPointer(vertexSize, GL_FLOAT, 0, self.vertexes );
glEnableClientState(GL_VERTEX_ARRAY);
glColorPointer(4, GL_FLOAT, 0, self.colors);
glEnableClientState(GL_COLOR_ARRAY);                


//Render with Texturing 
if (materialKey != nil) {

    [[MaterialController  sharedMaterialController] bindMaterial:materialKey];

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, 0, uvCoordinates);

}


//Render
glDrawArrays( renderStyle, 0, self.vertexCount);
}

レンダリング方法でテクスチャ コード配列を無効にすると、テクスチャ オブジェクトが正常に動作する限り、それらは完全に消えます。

それは何か関係がありglEnable(GL_TEXTURE_2D)ますか?

4

1 に答える 1

0

テクスチャリングされたオブジェクトをレンダリングした後、呼び出してテクスチャリングを無効にする必要があります(あなたのメソッドが呼び出すglDisable(GL_TEXTURE_2D)と思います)。テクスチャ座標配列を ( で) 無効にするだけでは十分ではありません (ただし、テクスチャ ジオメトリをレンダリングした後にこれを行う必要があります)。MaterialControllerbindMaterialglEnable(GL_TEXTURE_2D)glDisableClientState(GL_TEXTURE_COORD_ARRAY)

...
glDrawArrays( renderStyle, 0, self.vertexCount);

if(materialKey != nil)
{
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);
}

OpenGL はステート マシンであり、変更するすべての状態 (テクスチャリングの有効化など) は、再度変更するまでその値を保持することに常に注意してください。そのため、アプリケーションのどの部分が OpenGL の状態 (bindMaterialメソッドなど) を変更するのかを常に認識し、レンダリングの直前に必要なすべての状態を設定する必要があります。

于 2011-10-13T23:17:33.067 に答える