c++ - 为什么我的三角形是白色的?

标签 c++ opengl shader

我正在学习本教程 http://learnopengl.com/#!Getting-started/Hello-Triangle本教程的问题是没有完整的代码示例,而且很难闲下来。我的代码运行成功,但我的三角形是空白/白色。而且我认为有些函数被调用了两次,如果我删除其中一些命令,程序仍然可以运行成功。

// SHADERS
GLuint VBO;
GLuint VAO = 0;
GLuint program;
GLuint vertexShader;
GLuint fragmentShader;

const char* vertexShaderSource =
    "#version 330"
    "layout (location = 0) in vec3 position;"
    "void main(){"
    "gl_Position = vec4(position.x, position.y, position.z, 1.0);"
    "}";
const char* fragmentShaderSource =
    "#version 330"
    "out vec4 color;"
    "void main(){"
    "color = vec4(1.0, 0.5, 1.0, 1.0);"
    "}";

void compileShaders() {
    vertexShader = glCreateShader(GL_VERTEX_SHADER); // pravi vertex shader
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); // Odredjuje izvor vertex shadera
    glCompileShader(vertexShader); // kompajlira shader

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vertexShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
}

void linkShaders() {
    program = glCreateProgram(); // pravi program ID

    // Linkuje shaderse i program
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glLinkProgram(program);

    glUseProgram(program); // koristi program

    // Brise shaderse jer vise nisu potrebni i tako oslobadja memoriju
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0); // MISLIM DA JE OVO VISAK
}

void initVBO() {
    GLfloat vertices[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f,  0.5f, 0.0f
    };

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
}

void initVAO() {
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
}

void Init() {
    glClearColor(0.20, 0.63, 0.67, 1.0);
    glViewport(0, 0, WIDTH, HEIGHT);

    compileShaders();
    linkShaders();
}

void Render() {
    glClear(GL_COLOR_BUFFER_BIT);

    initVAO();
    initVBO();

    glUseProgram(program);

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0); // oslobadja momoriju

    glutSwapBuffers();
}

最佳答案

您的着色器不应编译。因此,您没有有效的程序。根据 GL 上下文的配置文件 - 以及实际的 GL 实现 - 你会得到不同的结果。使用 nvidia 驱动程序,您通常会在这种情况下看到一个白色三角形。

您的着色器无效的原因是因为您忘记在#version 330 指令之后添加换行符\n。 您正在使用 C/C++ 的语法通过组合 "string1""string2" 来连接字符串。您在引号外有一个换行符这一事实完全无关紧要,您指定的字符串是

#version 330layout (location = 0) in vec3 position;[...]

全部在一行中,这不是有效的预处理器语句...

您应该始终检查着色器的编译状态和程序的链接状态。并且您应该始终查询编译器和链接器信息日志。看看the OpenGL wiki artice about shader compilation有关如何执行此操作的详细信息。

关于c++ - 为什么我的三角形是白色的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33856992/

相关文章:

c++ - 为什么 Doom3 会切换列主矩阵和行主矩阵?

java - 多个纹理绑定(bind)到单个 VBO 并使用着色器渲染 (LWJGL)

opengl-es - getUniformLocation 返回空

c++ - 为什么 GNU make 总是重新链接我的项目?

c++ - 用于跟踪 CreateFile 调用的 Pin 工具

c++ - iOS 13 崩溃 - 回溯不可用

android - libgdx 和预建着色器?

java - 原始装饰器的实际缺点

opengl - 我怎么能简单地将 GLSL 编译为 SPIR-V?

algorithm - 将一维高斯模糊应用于数据集