0

私はopengl es 2.0を学んでいます。opengl es 2.0 でオルソ投影を適用しようとしています。正方形を描画しますが、実際には画面に正方形が表示されません。そして、どの部分が欠けているのかわからない。ご協力ありがとうございました!setupRenderingEnv には投稿していないメソッドがいくつかあります。しかし、これらの方法はフレームを設定するためのものであり、正常に機能します。m_program は正常に作成されます。繰り返しますが、あなたの助けに感謝します。

// my vertex shader
attribute vec4 Position;
attribute vec4 SourceColor;

uniform mat4 Projection;

varying vec4 DestinationColor;

void main(void)
{
    DestinationColor = SourceColor;
    gl_Position = Projection * Position;
}  

// my drawing file
typedef struct 
{
    float Position[3];
    float Color[4];
}Vertex;

const Vertex Vertices[] =
{
    {{100, -100, 0}, {1, 0, 0, 1}},
    {{100, 100, 0}, {0, 1, 0, 1}},
    {{-100, 100, 0}, {0, 0, 1, 1}},
    {{-100, -100, 0}, {0, 0, 0, 1}}
};

const GLubyte Indices[] =
{
    0, 1, 2,
    2, 3, 0
};

- (void)setupRenderingEnv
{
    [super setupRenderingEnv];
    [self setupVertexBufferObjects];
    [self setupRunLoop];

    [self applyOrthoWithX:self.frame.size.width andY:self.frame.size.height];

    glViewport(0, 0, self.frame.size.width, self.frame.size.height);

}


//-- used for applying ortho in opengl es 2.0
- (void)applyOrthoWithX:(float)maxX andY:(float)maxY
{
    float a = 1.0f / maxX;
    float b = 1.0f / maxY;
    float ortho[16] =
    {
        a, 0, 0, 0,
        0, b, 0, 0,
        0, 0, -1, 0,
        0, 0, 0, 1
    };

    GLint projectionUniform = glGetUniformLocation(super.m_programHandle, "Projection");
    glUniformMatrix4fv(projectionUniform, 1, 0, &ortho[0]);
}


//-- overriding drawCandle. it render image, draw candle
- (void)drawCandle
{
    glClearColor(0, 104.0/255, 55.0/255, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);

    GLuint positionSlot = glGetAttribLocation(super.m_programHandle, "Position");
    GLuint colorSlot = glGetAttribLocation(super.m_programHandle, "SourceColor");

    glEnableVertexAttribArray(positionSlot);
    glEnableVertexAttribArray(colorSlot);

    glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, 
                          sizeof(Vertex), 0);
    glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, 
                          sizeof(Vertex), (GLvoid *)(sizeof(float) *     3));


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

    glDisableVertexAttribArray(positionSlot);
    glDisableVertexAttribArray(colorSlot);

    [super drawCandle];
}
4

1 に答える 1

3

ビューポートはどのような形ですか? 正方形でない場合、それが問題です。作成しているマトリックス (逆幅と逆高によるスケーリング) は、幅が常に 1 単位の幅で、高さが 1 単位の高さになるようにします。幅と高さが同じピクセル数でない場合、正方形は正方形を描画しません。ビューポートの縦横比を考慮する必要があります。私の頭の上から、それは次のようなものになると思います:

float ortho [ 16 ] = {
    a / b, 0, 0, 0,
    0, b, 0, 0,
    0, 0, -1, 0,
    0, 0, 0, 1
};

(a/b が逆になっている可能性があります - 思い出せません)

于 2012-07-23T04:50:36.843 に答える