2011-12-01 75 views
1

我試圖將我爲iOS編寫的一些OpenGL渲染代碼移植到Windows應用程序中。該代碼在iOS上運行良好,但在Windows上不會畫任何東西。我已經將問題縮小到這些代碼中,因爲固定功能的東西(比如glutSolidTorus)可以很好地工作,但是當着色器被啓用時,什麼都不起作用。GLSL着色器編譯但在Windows上不繪製任何東西

這裏的呈現代碼:

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

我運行的OpenGL 2.1的Shader語言1.2。我會非常感謝任何人都可以給我的幫助。

+1

你確定你的'Projection'等矩陣設置正確嗎? –

+0

GL_INDEX_ARRAY不是你認爲的那樣。你不需要它(儘管我懷疑這是你的問題)。 – Bahbar

回答

0

最近我又回到了這裏,似乎在渲染過程中我沒有檢查錯誤,它在調用glDrawElements()後給我一個1285錯誤GL_OUT_OF_MEMORY。這導致我檢查頂點緩衝區對象以查看它們是否包含任何數據,結果是我沒有正確地將它們複製到包裝類中,結果它們在任何呈現發生之前被刪除。解決這個問題。

謝謝您的建議。

1

我很同意你在片段着色器中爲片段的輸出顏色分配黑色。嘗試將其改爲類似於

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

並查看場景中的對象是否將着綠色。

+0

這不是問題,因爲我的清晰顏色是白色的,但它確實幫助我在發現問題後進行調試。 –