我正在使用 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
}