【问题标题】:Cannot Link GLSL Program无法链接 GLSL 程序
【发布时间】:2016-10-05 17:35:48
【问题描述】:

我无法使用以下代码。我想渲染我在position[] 中描述的三角形。

该程序有时会给我一个着色器编译错误或一个程序链接错误,有时甚至两者都没有我在两者之间更改代码。

程序:

Window window(TITLE, WIDTH, HEIGHT) // Context and glew gets init here

float position[] = {-0.5, -0.5, 0.0,
                     0.5, -0.5, 0.0,
                     0.0,  0.5, 0.0};

// Shader program gets init
sID = glCreateProgram();
vertexShaderID = glCreateShader(GL_Vertex_SHADER);
fragShaderID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShaderID, 1, vertexShaderCodeString); // The Code strings are valid, I printed them out
glShaderSource(fragmentShaderID, 1, fragShaderCodeString);

glCompileShader(vertexShaderID);
glCompileShader(fragShaderID);
shaderDidCompileCheck(vertexShaderID); // A function I wrote that checks for errors
shaderDidCompileCheck(fragShaderID);

glAttachShader(sID, vertexShaderID);
glAttachShader(sID, fragShaderID);

glLinkProgram(sID);
programDidLinkCheck(); // A function I wrote that checks for errors
glValidateProgram(sID);

glUseProgram(sID);
glBindAttribLocation(sID, 0, "position");
glUseProgram(0);

// Defining VBOs and VAOs
int bufferID;
glGenBuffers(1, &bufferID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
glBufferData(GL_ARRAY_BUFFER, 3 * 3 * sizeof(float), mDataPtr, GL_STATIC_DRAW); // I have 3 vertices with 3 coordinates each
glBindBuffer(GL_ARRAY_BUFFER, 0);

int vaoID;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); // I Want to load it to the index 0 of the VAO, the vertex size is 3, the data type is GL_FLOAT
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);

glBindVertexArray(vaoID);
glEnableVertexAttribArray(0);
glBindVertexArray(0);

// Main loop
while(!window.close()) {
    glClearColor(0.3, 0.8, 0.6, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(sID);
    glBindVertexArray(vaoID);
    glDrawArrays(GL_TRIANGLES, 0, 1);
    glBindVertexArray(0);
    glUseProgram(0);

    glfwSwapBuffers(mWindow);
    glfwPollEvents();
}

顶点着色器:

#version 410
in vec3 position;
out vec3 color;

void main() {
    gl_Position = vec4(position, 1.0);
    color = vec3(position.x + 0.5, 0.5, position.y + 0.5);
}

片段着色器:

#version 410
in vec3 color;
out vec4 outputColor;

void main() {
    outputColor = vec4(color, 1.0);
}

【问题讨论】:

  • 您的链接器或着色器必须返回错误代码。那个错误代码是什么?
  • 您必须在glLinkProgram 之前执行glBindAttribLocation。我会推荐www.learnopengl.com
  • 嗯,我得到的错误代码只是我自己写的一个默认字符串。
  • 已经在glLinkProgram 之前尝试过glBindAttribLocation,但它确实有效。不过感谢您的帮助。
  • "glAttatchShader" 不是 GL 函数。也许你的意思是“glAttachShader”。

标签: c++ opengl graphics


【解决方案1】:

我认为您的代码中有一些拼写错误。你写“vertexShaderID = glCreateShader(GL_Vertex_SHADER)”,但宏用大写字母表示->“GL_VERTEX_SHADER”。试试 glShaderSource(vertexShaderID, 1, vertexShaderCodeString, NULL),而不是传递 3 个参数。

【讨论】:

    【解决方案2】:

    您是如何保存着色器的源代码的?让舒尔拥有\n 在版本声明之后,否则您最终将代码与 # 在同一行,这是不好的。

    【讨论】:

    • 我检查了字符串,一切正常......好吧,我想我应该从头开始整个项目并下载新的图形驱动程序......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2018-08-12
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多