2

OpenCL と GLUT 関数を使用して N-Body/GPU プログラムをコーディングしましたが、問題なく動作します。メイン GLUT ウィンドウを Qt グラフィカル インターフェイスを使用して QGLWidget サブクラス ("here GLWidget") に変換するために、今それを変換しようとしています。

私の問題は、「プログラム頂点シェーダー」リンクが失敗することです。ソース ファイル " 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 のデータ メンバーであることに注意してください。

誰が何が悪いのか見ることができましたか?

より一般的には、私のコードの最初のバージョン (Qt ユーザー インターフェイスなし) で行ったように、GLWidget オブジェクトで同じ GLUT 関数 " glAttachShader"、" " を直接使用できますか?glLinkProgram

4

1 に答える 1

1

ターゲットにしているOpenGL/GLSLのバージョンに応じて、正常にリンクするために簡単なフラグメントシェーダーは必要ありませんか?OpenGL 4.1について言及しましたが、頂点シェーダーコードは、GLSL 3.3で非推奨となったGLSL変数名を使用しています(たとえば、gl_TexCoord)。

于 2013-02-14T13:25:19.107 に答える