Проблема при попытке использовать простые шейдеры + VBOs - PullRequest
3 голосов
/ 14 июня 2010

Здравствуйте. Я пытаюсь преобразовать следующие функции в основанную на VBO функцию для целей обучения, она отображает статическую текстуру на экране.Я использую OpenGL ES 2.0 с шейдерами на iPhone (в данном случае он должен быть почти таким же, как обычный OpenGL), вот что я получил:

//Works!
- (void) drawAtPoint:(CGPoint)point depth:(CGFloat)depth
{
    GLfloat             coordinates[] = {
                            0,          1,
                            1,          1,
                            0,          0,
                            1,          0
                        };

    GLfloat             width = (GLfloat)_width * _maxS,
                        height = (GLfloat)_height * _maxT;

    GLfloat             vertices[] = {
                            -width / 2 + point.x,       -height / 2 + point.y,
                            width / 2 + point.x,        -height / 2 + point.y,
                            -width / 2 + point.x,       height / 2 + point.y,
                            width / 2 + point.x,        height / 2 + point.y,   
                        };


    glBindTexture(GL_TEXTURE_2D, _name);
    //Attrib position and attrib_tex coord are handles for the shader attributes
    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, vertices);
    glEnableVertexAttribArray(ATTRIB_POSITION);
    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, coordinates);
    glEnableVertexAttribArray(ATTRIB_TEXCOORD);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

Я пытался сделать это, чтобы преобразовать вVBO, однако я не вижу ничего отображаемого на экране с этой версией:

//Doesn't display anything
- (void) drawAtPoint:(CGPoint)point depth:(CGFloat)depth
{
    GLfloat             width = (GLfloat)_width * _maxS,
                        height = (GLfloat)_height * _maxT;

    GLfloat             position[] = {
                            -width / 2 + point.x,       -height / 2 + point.y,
                            width / 2 + point.x,        -height / 2 + point.y,
                            -width / 2 + point.x,       height / 2 + point.y,
                            width / 2 + point.x,        height / 2 + point.y,   
                        }; //Texture on-screen position ( each vertex is x,y in on-screen coords )

    GLfloat             coordinates[] = {
        0,          1,
        1,          1,
        0,          0,
        1,          0
    }; // Texture coords from 0 to 1

    glBindVertexArrayOES(vao);
    glGenVertexArraysOES(1, &vao);
    glGenBuffers(2, vbo);

    //Buffer 1
    glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), position, GL_STATIC_DRAW);
    glEnableVertexAttribArray(ATTRIB_POSITION);
    glVertexAttribPointer(ATTRIB_POSITION, 2, GL_FLOAT, GL_FALSE, 0, position);

    //Buffer 2
    glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
    glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(GLfloat), coordinates, GL_DYNAMIC_DRAW);    
    glEnableVertexAttribArray(ATTRIB_TEXCOORD);
    glVertexAttribPointer(ATTRIB_TEXCOORD, 2, GL_FLOAT, GL_FALSE, 0, coordinates);

    //Draw
    glBindVertexArrayOES(vao);
    glBindTexture(GL_TEXTURE_2D, _name);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

В обоих случаях я использую этот простой вершинный шейдер

//Vertex Shader
attribute vec2 position;//Bound to ATTRIB_POSITION
attribute vec4 color; 
attribute vec2 texcoord;//Bound to ATTRIB_TEXCOORD

varying vec2 texcoordVarying;

uniform mat4 mvp;

void main()
{
    //You CAN'T use transpose before in glUniformMatrix4fv so... here it goes.
    gl_Position = mvp * vec4(position.x, position.y, 0.0, 1.0);
    texcoordVarying = texcoord;
}

Значение gl_Position равнок продукту mvp * vec4, потому что я симулирую glOrthof в 2D с этим mvp

и этим фрагментным шейдером

//Fragment Shader
uniform sampler2D sampler;

varying mediump vec2 texcoordVarying;

void main()
{
    gl_FragColor = texture2D(sampler, texcoordVarying);
}

Мне действительно нужна помощь с этим, возможно, мои шейдеры не подходят длявторой случай?

спасибо заранее.

1 Ответ

2 голосов
/ 14 июня 2010

Все правильно, кроме вызова glVertexAttribPointer.

Если у вас есть привязка к VBO, последний параметр o glVertexAttribPointer используется как смещение в VBO, как указатель (значение указателя является смещением). Итак, ваши данные находятся в начале VBO, поэтому последний параметр должен быть 0 (NULL) для обоих вызовов.

...