2012-11-19 19 views
2

我已經使用OpenCL和GLUT函數對N-Body/GPU程序進行了編碼,並且它工作正常。我現在嘗試轉換它,以便通過Qt圖形界面將主GLUT窗口變爲QGLWidget子類(「此處爲GLWidget」)。Qt - GLUT - 頂點着色器程序鏈接

我的問題是「程序頂點着色器」鏈接失敗。這裏是源文件「GLWidget.cpp」在那裏我在「_compileProgram」錯誤「Failed to link program」獲得的這一部分:

extern const char *vertexShader; 

void GLWidget::GLInit() 
{ 
    LoadGLTextures(); // load the textures. 
    glClearColor(0.0 ,0.0, 0.0, 0.0); 
    glMatrixMode(GL_PROJECTION);  
    glLoadIdentity(); 

    m_program = _compileProgram(vertexShader); 

    glClampColor(GL_CLAMP_VERTEX_COLOR, GL_FALSE); 
    glClampColor(GL_CLAMP_FRAGMENT_COLOR, GL_FALSE); 

    // memsize of GPU data 
    unsigned int memSize = sizeof(cl_double4) * 4 * Galaxy->getNumParticles(); 

    createVBO(memSize); 
} 

void GLWidget::createVBO(uint size) 
{ 
    GLuint vbo; 
    glGenBuffers(1, &vbo); 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glBufferData(GL_ARRAY_BUFFER, size, Galaxy->pos, GL_DYNAMIC_DRAW); 
} 

GLuint GLWidget::_compileProgram(const char *vsource) 
{ 
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    glShaderSource(vertexShader, 1, &vsource, 0); 
    glCompileShader(vertexShader); 
    GLuint program = glCreateProgram(); 
    glAttachShader(program, vertexShader); 
    glLinkProgram(program); 

    // check if program linked 
    GLint success = 0; 
    glGetProgramiv(program, GL_LINK_STATUS, &success); 

    if (!success) { 
     char temp[256]; 
     glGetProgramInfoLog(program, 256, 0, temp); 
     printf("Failed to link program:\n%s\n", temp); 
     glDeleteProgram(program); 
     program = 0; 
} 
    return program; 
} 

我shader.cpp使用下面的頂點着色器程序:

#define STRINGIFY(A) #A 

// vertex shader 
const char *vertexShader = STRINGIFY(
uniform float pointRadius; // point size in world space 
uniform float pointScale; // scale to calculate size in pixels 
void main() 
{ 
    // calculate window-space point size 
    vec3 posEye = vec3(gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1.0)); 
    float dist = length(posEye); 
    gl_PointSize = pointRadius * (pointScale/dist); 

    gl_TexCoord[0] = gl_MultiTexCoord0; 
    gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0); 

    gl_FrontColor = gl_Color; 
} 
); 

我讓你注意到「GLuint m_program」是子類GLWidget的一個數據成員。

任何人都可以看到有什麼問題嗎?更一般地說,我可以直接在GLWidget對象上直接使用相同的GLUT函數「glAttachShader」,「glLinkProgram」,就像我使用我的代碼的第一個版本(即不使用Qt用戶界面)一樣嗎?

+1

因此'glGetProgramInfoLog(..)'不會返回一個字符串,說明鏈接失敗的原因? – cmannett85

+0

@ cmannett85不,它只返回:「無法鏈接程序:」 – youpilat13

+0

你忘了[檢查*着色器*,看它是否編譯](http://www.opengl.org/wiki/GLSL_Object#Error_handling)。它有自己的編譯狀態和信息日誌。 –

回答

1

根據您要定向的OpenGL/GLSL版本,您是否需要一個簡單的片段着色器才能成功鏈接?你提到OpenGL 4.1,但你的頂點着色器代碼使用GLSL 3.3中棄用的GLSL變量名稱(例如gl_TexCoord)