【问题标题】:ios opengl es 2.0, my rectangle is not square when I applied orthoios opengl es 2.0,当我应用正交时,我的矩形不是正方形
【发布时间】:2012-07-23 12:50:36
【问题描述】:

我正在学习 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];
}

【问题讨论】:

    标签: ios opengl-es-2.0 orthographic


    【解决方案1】:

    你的视口是什么形状的?如果不是正方形,那就是问题所在。您正在创建的矩阵 - 按反向宽度和反向高度缩放 ​​- 将使宽度始终为 1 个单位宽,高度为 1 个单位高。如果宽度和高度不是相同的像素数,则正方形不会绘制正方形。您需要考虑视口的纵横比。在我的脑海中,我认为它会更像这样:

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

    (我可能有 a/b 倒置 - 不记得了)

    【讨论】:

    • 我在 iphone 模拟器 5.1 上运行了这个
    • 这是 320 x 480.. 但这真的是问题吗??
    • 是的,这很可能是问题所在。由于 320 x 480 不是 1:1 的纵横比,因此您需要在正交投影矩阵或用于绘制屏幕的坐标中考虑这一点。我强烈建议设置您的正交投影矩阵来补偿它,以便您的像素是方形的,因为处理非方形像素是一件非常痛苦的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多