Создание экземпляров OpenGL: используя mat4x2 или vec2[4]

Следуйте примерам онлайн, вот код в вершинном шейдере:

Атрибуты определены следующим образом:

// Option 1:
layout (location = 0) in vec3 colorvec3;
layout (location = 1) in mat4x2 xyInBaseImageMat4x2;

out vec2 xyInElementTextureImage;
out vec3 elementTintColorVec3;

В вершинном шейдере они используются:

// Option 1
vec2 xyInBaseImageVec2 = xyInBaseImageMat4x2[gl_VertexID];
gl_Position = vec4(xyInBaseImageVec2, 0.0, 1.0);
elementTintColorVec3 = colorvec3;

Но результат странный, совершенно случайный. Иногда это черный, иногда это случайная форма.

Но если я перейду на использование:

// Option 2:
layout (location = 0) in vec3 colorvec3;
layout (location = 1) in vec2 xyInBaseImageVec2_p0;
layout (location = 2) in vec2 xyInBaseImageVec2_p1;
layout (location = 3) in vec2 xyInBaseImageVec2_p2;
layout (location = 4) in vec2 xyInBaseImageVec2_p3;

out vec2 xyInElementTextureImage;
out vec3 elementTintColorVec3;

В вершинном шейдере:

// Option 2:
vec2 xyInBaseImageVec2;
if (gl_VertexID==0) {
    xyInBaseImageVec2 = xyInBaseImageVec2_p0;
} else if (gl_VertexID==1) {
    xyInBaseImageVec2 = xyInBaseImageVec2_p1;
} else if (gl_VertexID==2) {
    xyInBaseImageVec2 = xyInBaseImageVec2_p2;
} else if (gl_VertexID==3) {
    xyInBaseImageVec2 = xyInBaseImageVec2_p3;
}
gl_Position = vec4(xyInBaseImageVec2, 0.0, 1.0);
elementTintColorVec3 = colorvec3;

Тогда это работает как хотелось бы.

Буфер данных для положения цвета и вершины одинаков для двух примеров. [Обновление: добавьте код кормления ниже]

// refer to the code in: http://sol.gfxile.net/instancing.html
// refer to the code in: http://www.gamedev.net/page/resources/_/technical/opengl/opengl-instancing-demystified-r3226
// Case: instaced vertex positions. So each instance should have 4 vec2
{
    // in mat4x2;  later try in vec2[4] xyInBaseImage_vec2list if mat4x2 does not work.
    GLuint instanceVBO = instancevbo_4pts;
    int pos = 1;
    int componentsSize = 2;  // vec2 has 2 components
    // if it is mat, then componentsNum is the column number of the matrix; for example, for mat4x2 it is 4
    int componentsNum = 4; // mat4x2
    GLenum type = GL_FLOAT;
    GLboolean normalized = GL_FALSE;
    GLsizei stride = componentsSize * sizeof(GL_FLOAT) * componentsNum;
    char* pointerFirstComponentOffset = 0;
    int offsetInteger = 0;
    int byteSizeOfOneVertexAttribute = componentsSize * sizeof(GL_FLOAT);
    GLuint divisor = 1;  // 0 not instance
    glBindBuffer(GL_ARRAY_BUFFER, instanceVBO);
    for (int i = 0; i < componentsNum; i++) {
        glEnableVertexAttribArray(pos + i);
        // the offset can also be: (void*) (offsetInteger + i * byteSizeOfOneVertexAttribute)
        glVertexAttribPointer(pos + i, componentsSize, type,
                                                     normalized, stride, pointerFirstComponentOffset + i * byteSizeOfOneVertexAttribute  );
        glVertexAttribDivisor(pos + i, divisor);
    }
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

Что не так с первым вариантом?

0 ответов

Другие вопросы по тегам