我已經使用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用戶界面)一樣嗎?
因此'glGetProgramInfoLog(..)'不會返回一個字符串,說明鏈接失敗的原因? – cmannett85
@ cmannett85不,它只返回:「無法鏈接程序:」 – youpilat13
你忘了[檢查*着色器*,看它是否編譯](http://www.opengl.org/wiki/GLSL_Object#Error_handling)。它有自己的編譯狀態和信息日誌。 –