0

私のプロジェクトでは、5 つのテクスチャ レイヤーを作成したいと考えています。

各レイヤーは、それぞれ 4 つのテクスチャ付きの長方形で構成されています。レイヤーのこれら 4 つの部分は、1 つの大きなテクスチャのように見えるように配置されます。レイヤーは部分的に透明で、3 次元の外観を作成するために互いの前に配置されます。

1 つのレイヤーのみを有効にしてプロジェクトを実行すると、すべて問題ないように見えますが、2 つ目 (またはそれ以上) のレイヤーを追加するとすぐにすべてが混乱します。一部のパーツが欠落し、他のパーツの z 座標が完全に間違っています (値自体は問題ないように見えますが、背景レイヤーが突然最前面のレイヤーになります)。一部のパーツは x 座標をシフトすることさえあります (NSLog を使用してすべての正方形座標を出力する場合、これはセットアップ時にも適切に見えます)。

これは、オブジェクト座標を VBO に書き込む setupVBOs 関数です (すべての正方形が同じであるため、インデックス VBO は 1 つしかありませんが、レイヤーのすべての部分の座標を保持するために 5x4 VBO の配列があります)。

- (void)setupVBOs {

glGenBuffers(1, &_indexBufferLayer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBufferLayer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(IndicesLayer), IndicesLayer, GL_STATIC_DRAW);

for (int layerNo = 1; layerNo < LAYER_COUNT + 1; ++layerNo)
{
    for (int layerPart = 1; layerPart < LAYER_PARTS + 1; ++layerPart)
    {   
        glGenBuffers(1, &_vertexBufferLayer[layerNo][layerPart]);
        GLfloat x = -3.0 + (2.0 * (layerPart - 1));
        GLfloat z = 0.0 + (50.0 * (layerNo - 1));

        NSLog(@"Layer %d, Part %d: x=%f, z=%f", layerNo, layerPart, x, z);

        // Alter the Texture slightly to
        // remove errors from compression (x-Coord.)
        Vertex Vertices[] = {
            {{x + 1.0, -1.0, z}, {0.9865, 1.0}},
            {{x + 1.0, +1.0, z}, {0.9865, 0}},
            {{x - 1.0, +1.0, z}, {0.01, 0}},
            {{x - 1.0, -1.0, z}, {0.01, 1.0}}
        };

        glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferLayer[layerNo][layerPart]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);

        x = z = 0;
    }
}
}

これは、すべてを描画してテクスチャを追加するレンダリング関数です。

- (void)render: (CADisplayLink*)displayLink {


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

CC3GLMatrix *projection = [CC3GLMatrix matrix];
float h = 4.0f * self.frame.size.height / self.frame.size.width;
[projection populateFromFrustumLeft:-1 andRight:1 andBottom:-h/4 andTop:h/4 andNear:2 andFar:500];


CC3GLMatrix *modelView = [CC3GLMatrix matrix];

// Translate the Modelviewmatrix
[modelView populateFromTranslation:CC3VectorMake(_cameraX, _cameraY, -5.0)];

// Rotate the Modelviewmatrix
[modelView rotateBy:CC3VectorMake(_currentRotation, 0, 90)];

[modelView translateByZ:_cameraZoom];    

//
// Draw all layers
//
for (int layerNo = 1; layerNo < LAYER_COUNT + 1; layerNo++)
{
    GLfloat layerFactor = (LAYER_COUNT + 1 - layerNo) * 22.0;

    GLfloat scaleFactor = 100.0 + layerFactor;

    [modelView scaleByX:scaleFactor];
    [modelView scaleByY:scaleFactor];

    for (int layerPart = 1; layerPart < LAYER_PARTS + 1; layerPart++)
    {            
        glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix);
        glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix); 
        GLuint uniformTexture = glGetUniformLocation(programHandle, "Texture");

        // Bind Buffer and Texture
        glBindBuffer(GL_ARRAY_BUFFER, _vertexBufferLayer[layerNo][layerPart]);

        // Activate Texturing Pipeline and Bind Texture
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, _layers[layerNo][layerPart][0]);
        glUniform1i(uniformTexture, 0);

        // Vertex Shader calls
        glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) 0);
        glVertexAttribPointer(_texCoordSlot, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3));

        glEnableVertexAttribArray(_positionSlot);
        glEnableVertexAttribArray(_texCoordSlot);

        glDrawElements(GL_TRIANGLES, sizeof(IndicesLayer)/sizeof(IndicesLayer[0]), GL_UNSIGNED_BYTE, 0);

        glDisableVertexAttribArray(_texCoordSlot);
        glDisableVertexAttribArray(_positionSlot);    
    }

    [modelView scaleByX:1/scaleFactor];
    [modelView scaleByY:1/scaleFactor];

}
[_context presentRenderbuffer:GL_RENDERBUFFER];
}
4

1 に答える 1

0

使用する:

glenable(GL_TEXTURE_2D)

また:

glActiveTexture — select active texture unit 
于 2012-07-27T17:58:49.527 に答える