Шейдеры GLSL компилируются, но ничего не рисуют в Windows - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь перенести некоторый код рендеринга OpenGL, который я написал для iOS, в приложение Windows. Код хорошо работает на iOS, но на Windows ничего не рисует. Я сузил проблему до этого фрагмента кода, поскольку исправленные функции (например, glutSolidTorus) хорошо рисуются, но когда шейдеры включены, ничего не работает.

Вот код рендеринга:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_INDEX_ARRAY);

// Set the vertex buffer as current
this->vertexBuffer->MakeActive();

// Get a reference to the vertex description to save copying
const AT::Model::VertexDescription & vd = this->vertexBuffer->GetVertexDescription();

std::vector<GLuint> handles;

// Loop over the vertex descriptions
for (int i = 0, stride = 0; i < vd.size(); ++i)
{
    // Get a handle to the vertex attribute on the shader object using the name of the current vertex description
    GLint handle = shader.GetAttributeHandle(vd[i].first);

    // If the handle is not an OpenGL 'Does not exist' handle
    if (handle != -1)
    {
        glEnableVertexAttribArray(handle);
        handles.push_back(handle);

        // Set the pointer to the vertex attribute, with the vertex's element count,
        // the size of a single vertex and the start position of the first attribute in the array
        glVertexAttribPointer(handle, vd[i].second, GL_FLOAT, GL_FALSE, 
                                sizeof(GLfloat) * (this->vertexBuffer->GetSingleVertexLength()), 
                                (GLvoid *)stride);

    }

    // Add to the stride value with the size of the number of floats the vertex attr uses
    stride += sizeof(GLfloat) * (vd[i].second);
}

// Draw the indexed elements using the current vertex buffer
glDrawElements(GL_TRIANGLES, 
               this->vertexBuffer->GetIndexArrayLength(), 
               GL_UNSIGNED_SHORT, 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_INDEX_ARRAY);


// Disable the vertexattributearrays
for (int i = 0, stride = 0; i < handles.size(); ++i)
{
    glDisableVertexAttribArray(handles[i]);
}

Он находится внутри функции, которая принимает шейдер в качестве параметра, а описание вершины представляет собой список пар: атрибут обрабатывает количество элементов. Униформа устанавливается за пределами этой функции. Я включаю шейдер для использования до его передачи в функцию. Вот два источника шейдеров:

Vertex:

attribute vec3 position;
attribute vec2 texCoord;
attribute vec3 normal;

// Uniforms

uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;
uniform mat3 NormalMatrix;


/// OUTPUTS

varying vec2 o_texCoords;
varying vec3 o_normals;

// Vertex Shader

void main()
{
    // Do the normal position transform
    gl_Position = Projection * View * Model * vec4(position, 1.0);

    // Transform the normals to world space
    o_normals = NormalMatrix * normal;

    // Pass texture coords on for interpolation
    o_texCoords = texCoord;
}

Фрагмент:

varying vec2 o_texCoords;
varying vec3 o_normals;

/// Fragment Shader

void main()
{
    gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}

Я использую OpenGL 2.1 с языком шейдеров 1.2. Я был бы очень признателен за любую помощь, которую кто-нибудь может мне дать.

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Я видел, что вы назначаете черный цвет для выходного цвета для фрагмента в вашем фрагментном шейдере.Попробуйте изменить это на что-то вроде

 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);

и посмотрите, будут ли объекты на сцене окрашены в зеленый цвет.

0 голосов
/ 18 января 2012

Я недавно вернулся к этому, и похоже, что я не проверял ошибки во время рендеринга, он выдавал мне ошибку 1285 GL_OUT_OF_MEMORY после вызова glDrawElements (). Это заставило меня проверить объекты буфера вершин, чтобы увидеть, содержат ли они какие-либо данные, и оказалось, что я не копировал их должным образом в классе-обертке, и в результате они были удалены до того, как произойдет рендеринг. Исправление этой проблемы решило проблему.

Спасибо за ваши предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...