GLSL着色器编译但不在Windows上绘制任何内容

时间:2011-12-01 17:47:08

标签: ios windows opengl glsl shader

我正在尝试将我为iOS编写的一些OpenGL渲染代码移植到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]);
}

它位于一个以着色器作为参数的函数内部,顶点描述是一对对象列表:属性处理元素数量。正在设置制服以外的功能。我正在启用着色器,然后才能将其传递给函数。以下是两个着色器源:

顶点:

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);
}

我使用Shader语言1.2运行OpenGL 2.1。我非常感谢任何人都可以给我的任何帮助。

2 个答案:

答案 0 :(得分:1)

我知道您要为片段着色器中的片段分配输出颜色的黑色。尝试将其更改为

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

并查看场景中的对象是否会以绿色着色。

答案 1 :(得分:0)

我最近回到这里,似乎我在渲染过程中没有检查错误,在调用glDrawElements()之后它给了我一个1285错误GL_OUT_OF_MEMORY。这导致我检查顶点缓冲区对象以查看它们是否包含任何数据,结果发现我没有在包装类中正确地深度复制它们,因此它们在任何渲染发生之前被删除。修复这个问题排序了。

感谢您的建议。