OpenGL三角形不渲染

Posted

技术标签:

【中文标题】OpenGL三角形不渲染【英文标题】:OpenGL triangle not rendering 【发布时间】:2017-04-18 19:52:32 【问题描述】:

我已经用 C++ 编写了一些 OpenGL 代码来在屏幕上渲染一个红色三角形。该程序使用 opengl 3.3 和 glsl 330 版。我已将不起作用的代码缩小到一些 .cpp 类文件或我的 glsl 代码。我没有收到编译器或链接器错误(我确实收到了一些链接器警告,但我认为这些并不重要)。我已经在我认为最有可能发生错误的地方给出了代码。

渲染器.cpp:

#include "Renderer.h"

#include <GL/glew.h>

void Renderer::render(int vbo)
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);

ShaderProgram.cpp

#pragma warning(disable:4101)

#include "ShaderProgram.h"

#include <fstream>
#include <sstream>

ShaderProgram::ShaderProgram(std::string vertexLocation, std::string fragmentLocation)
    programID = glCreateProgram();
    vertexID = glCreateShader(GL_VERTEX_SHADER);
    fragmentID = glCreateShader(GL_FRAGMENT_SHADER);
    createShader(vertexID, vertexLocation);
    createShader(fragmentID, fragmentLocation);
    glLinkProgram(programID);
    GLint success;
    glGetProgramiv(programID, GL_LINK_STATUS, &success);
    if (success == 0) 
        GLchar ErrorLog[1024];
        glGetProgramInfoLog(programID, sizeof(ErrorLog), nullptr, ErrorLog);
        fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
    
    glValidateProgram(programID);
    glUseProgram(programID);


void ShaderProgram::createShader(GLint shaderID, std::string srcLocation)
    const std::string shaderText = loadShaderSource(srcLocation);
    const GLchar* shaderSource = shaderText.data();
    glShaderSource(shaderID, 1, &shaderSource, nullptr);
    glCompileShader(shaderID);
    GLint success;
    glGetShaderiv(shaderID, GL_COMPILE_STATUS, &success);
    if (!success) 
        GLchar InfoLog[1024];
        glGetShaderInfoLog(shaderID, sizeof(InfoLog), nullptr, InfoLog);
        fprintf(stderr, "Error compiling shader: '%s'\n", InfoLog);
    
    glAttachShader(programID, shaderID);


std::string ShaderProgram::loadShaderSource(std::string location)
    std::ifstream file (location);
    std::string source;
    std::stringstream stringStream;

    if (!file.is_open())
        throw std::runtime_error("Could not open file " + location);
    

    stringStream << file.rdbuf();
    source = stringStream.str();

    return source;

Entity.cpp

#include "Entity.h"

Entity::Entity()
    vertices[0] = glm::vec3(-1.0f, -1.0f, 0.0f);
    vertices[1] = glm::vec3(1.0f, -1.0f, 0.0f);
    vertices[2] = glm::vec3(0.0f, 1.0f, 0.0f);
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDisableVertexAttribArray(0);


int Entity::getID()
    return vbo;

GLSL 代码: 顶点着色器:

#version 330

layout (location = 0) in vec3 position;

void main()
    gl_Position = vec4(0.5 * position.x, 0.5 * position.y, position.z, 1.0);

片段着色器:

#version 330

out vec4 colour;

void main()
    colour = vec4(1.0, 0.0, 0.0, 1.0);

【问题讨论】:

您必须使用顶点数组对象 (VAO)。 @Ripi2:VAO 在兼容性上下文中是可选的。 好的,谢谢。明天我有空的时候试试。我所遵循的教程并不是我猜测的最好的。他们没有给我带来很好的结果 感谢您的信息 @genpfault:啊,是的。 OP 使用了在他之前的另一篇文章***.com/questions/43477531/… 中提到的兼容性上下文 【参考方案1】:

你不能像这样使用 glm::vec3。对它的引用不会为你提供任何东西。获得它的真实数组的开始:

glm::vec3 k;
float* t= &k[0];

但我怀疑你也可以用它做一些有价值的事情。

只使用浮点 GLfloat 数组。

【讨论】:

但是您应该使用glm::value_ptr(k) 而不是&amp;k[0]。基本上是一样的,不过是glm库推荐的方法。

以上是关于OpenGL三角形不渲染的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL不使用纹理渲染

初学者 openGL 项目渲染三角形的问题

OpenGL 三角形不会在 macOS 上渲染?

OpenGL:如何渲染完美的矩形渐变?

OpenGL:不能不渲染三角形

使用着色器渲染“顶点彩色”三角形时的OpenGL“黑屏”