Шейдер OpenGL не получает значение от glVertexAttribPointer () - PullRequest
1 голос
/ 02 июля 2019

Несмотря на то, что я вызываю glEnableVertexAttribArray и glVertexAttribPointer, мой вершинный шейдер не может получить доступ к значению (я говорю значение, потому что я не уверен, как оно называется, атрибут?).

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

В следующем коде шейдер может получить доступ к положению вершины в позиции атрибута 0 и нормали вершины в позиции атрибута 1, однако, когда я использую значение цвета вершины в позиции атрибута 2 в качестве цвета для моей сетки, это черный даже если установлено иное.

//Vertex Position
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, vertexPosition));

//Vertex Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, vertexNormal));

//Vertex Colour
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, vertexColor));

Вот структура Vertex

struct Vertex {

    glm::vec3 vertexPosition;
    glm::vec3 vertexNormal;
    glm::vec3 vertexColor;

    glm::vec2 textureCoords;

    glm::vec3 vertexTangent;
    glm::vec3 vertexBitangent;

    Vertex() {}

    Vertex(glm::vec3 vertexPosition, glm::vec3 vertexNormal = glm::vec3(0), glm::vec3 vertexColor = glm::vec3(0), glm::vec2 textureCoords = glm::vec2(0)) {
        this->vertexPosition = vertexPosition;
        this->vertexNormal = vertexNormal;
        this->textureCoords = textureCoords;
    }

};

Вот код шейдера. Если я раскомментирую закомментированную строку, сетка станет красной, как и ожидалось

#version 330 core

uniform mat4 uModelMatrix;
uniform mat4 uViewMatrix;
uniform mat4 uProjectionMatrix;
uniform vec3 uLightPosition;

layout(location = 0) in vec3 aVertexPosition;
layout(location = 1) in vec3 aVertexNormal;
layout(location = 2) in vec3 aVertexColor;

out vec3 viewDirection;
out vec3 lightPosition;
out vec3 fragmentPosition;
out vec3 materialColor;
flat out vec3 fragmentNormal;

void main(){

    materialColor = aVertexColor;
    //materialColor = vec3(0.5, 0, 0);

    mat4 modelViewMatrix = uViewMatrix * uModelMatrix;

    vec3 viewSpacePosition = (modelViewMatrix * vec4(aVertexPosition, 1)).xyz;
    viewDirection = normalize(viewSpacePosition);

    vec3 viewSpaceNormal = normalize(modelViewMatrix * vec4(aVertexNormal, 0)).xyz;
    fragmentNormal = viewSpaceNormal;
    fragmentNormal = aVertexNormal;

    lightPosition = uLightPosition;

    fragmentPosition = vec3(uModelMatrix * vec4(aVertexPosition, 1.0));

    gl_Position = uProjectionMatrix * modelViewMatrix * vec4(aVertexPosition, 1);
}

Даже если для vertexColor по умолчанию установлено значение glm::vec3(1) вместо glm::vec3(0), оно все равно остается черным. Я проверил значения vertexColor перед рисованием с помощью шейдера, и цвет не черный.

1 Ответ

2 голосов
/ 02 июля 2019

Похоже, вы не устанавливаете значение vertexColor в конструкторе Vertex.

Vertex(glm::vec3 vertexPosition, glm::vec3 vertexNormal = glm::vec3(0), glm::vec3 vertexColor = glm::vec3(0), glm::vec2 textureCoords = glm::vec2(0)) {
        this->vertexPosition = vertexPosition;
        this->vertexNormal = vertexNormal;
        this->vertexColor = vertexColor;
    }
...