三角形没有正确着色

问题描述 投票:0回答:0

我正在使用 SFML(而不是 GLFW)在 OpenGL C++ 中渲染一个三角形,但三角形有时显示颜色,有时完全是白色。我正在使用元素缓冲区渲染两个相互连接的三角形。我为 vao、vbo 和 ebo 制作了单独的课程。

我的代码:

#include <iostream>
using namespace std;

#include "glm/glm.hpp"
#include "glm/gtc/matrix_access.hpp"
#include "glm/gtc/type_ptr.hpp"
#include "glm/gtc/matrix_transform.hpp"
#include "glad/glad.h"

#include "ShaderHandler.hpp"
#include "VertexArrayObject.hpp"
#include "VertexBufferObject.hpp"
#include "ElementBufferObject.hpp"

int main() {
    //Window settings
    ContextSettings settings;
    settings.majorVersion = 4;
    settings.minorVersion = 3;
    settings.attributeFlags = ContextSettings::Core;

    //Window
    RenderWindow window(VideoMode(800, 480), "OpenGL - 4.3", Style::Close, settings);

    //Opengl initialization
    if (!gladLoadGL()) cout << "Failed to initialize OpenGL" << endl;

    //Clear color
    glClearColor(0.2f, 0.4f, 0.7f, 1.0f);

    //Vertex data
    GLfloat vertices[] = {
        -0.5, -0.5, 0.0,
        0.5, -0.5, 0.0,
        0.5, 0.5, 0.0,
        -0.5, 0.5, 0.0
    };

    unsigned int indices[] = {
        0, 1, 2,
        2, 3, 0
    };

    VertexArrayObject vao;
    VertexBufferObject vbo;
    ElementBufferObject ebo;
    //Generate VertexArrays and BindArrays
    vao.bind();

    vbo.bind();
    vbo.setBufferData(sizeof(vertices), vertices, GL_STATIC_DRAW);

    vao.attributePointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    vao.enableAttributesArray(0);

    vbo.unbind();

    ebo.bind();
    ebo.setBufferData(sizeof(indices), indices, GL_STATIC_DRAW);
    ebo.unbind();

    //Shader Handler
    ShaderHandler shaderHandler("vertex_shader.fs", "fragment_shader.fs");
    const char* vertexShaderSrc = shaderHandler.getShaderData(GL_VERTEX_SHADER);
    const char* fragmentShaderSrc = shaderHandler.getShaderData(GL_FRAGMENT_SHADER);

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER), fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSrc, NULL);
    glShaderSource(fragmentShader, 1, &fragmentShaderSrc, NULL);

    glCompileShader(vertexShader);
    glCompileShader(fragmentShader);

    GLuint program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);

    glLinkProgram(program);
    glUseProgram(program);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    //running
    bool running = true;
    //Render loop
    while (running) {
        Event event;
        while (window.pollEvent(event)) {
            if (event.type == Event::Closed)
                running = false;
        }

        //Rendering
        glClear(GL_COLOR_BUFFER_BIT);

        //Use program
        glUseProgram(program);
        //BInd vertex array
        vao.bind();
        //Bind buffer ebo
        ebo.bind();
        //Draw rectangles
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

        window.display();
    }
    
    //Free the data
    vao.free();
    vbo.free();
    ebo.free();
    
    //Close the window
    window.close();

    return 0;
}

我的顶点着色器

#version 430 core

layout (location = 0) in vec3 aPosition;

void main()
{
    gl_Position = vec4(aPosition, 1.0);
}

我的片段着色器:

#version 430 core

out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0, 0.0, 0.0, 1.0); // Red color
}
c++ opengl sfml
© www.soinside.com 2019 - 2024. All rights reserved.