我的程序没有渲染任何对象,并显示一个空白屏幕。我已经检查了任何OpenGL错误,但没有找到任何错误。
头文件(Display.h):
# include "glew.h"
# include "glfw3.h"
# include <iostream>
class Display
{
public:
Display() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_COMPAT_PROFILE);
if (window == nullptr)
{
window = glfwCreateWindow(649, 489, "GL_Lib", NULL, NULL);
}
glfwMakeContextCurrent(window);
glewInit();
};
static GLFWwindow* window;
void Create_Buffer(float f, float s, float t, float forth, float fifth, float sixth, unsigned int* ptr) {
float positions[6] = { f,s,t,forth,fifth,sixth };
glGenBuffers(1, ptr);
glBindBuffer(GL_ARRAY_BUFFER, *ptr);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);
return;
}
static unsigned int Create_Shader(const std::string& VertexShader, const std::string FragmentShader) {
unsigned int program = glCreateProgram();
unsigned int vs = Compile_Shader(VertexShader, GL_VERTEX_SHADER);
unsigned int fs = Compile_Shader(FragmentShader, GL_FRAGMENT_SHADER);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
glValidateProgram(program);
int status;
glGetProgramiv(program, GL_VALIDATE_STATUS, &status);
std::cout << status;
glDeleteShader(vs);
glDeleteShader(fs);
return program;
}
static unsigned int Compile_Shader(const std::string& source, unsigned int type)
{
unsigned int id = glCreateShader(type);
const char* src = source.c_str();
glShaderSource(id, 1, &src, nullptr);
glCompileShader(id);
//TODO: Error Handling
return id;
}
static void GLCheckError() {
while (GLenum error = glGetError())
{
std::cout << "Error (" << error << ")" << std::endl;
}
}
static void GLClearError()
{
while(glGetError != GL_NO_ERROR);
}
};
CPP文件(Main.cpp):
# pragma once
# include "glew.h"
# include "glfw3.h"
# include "Display.h"
# include <iostream>
int main()
{
Display* dis = new Display();
unsigned int* buffer = new unsigned int;
dis->Create_Buffer(-0.5f, -0.5f, 0.0f, -0.5f, 0.5f, -0.5f, buffer);
std::string vertexShader =
"#version 330 coren"
"n"
"layout(location = 0) in vec4 position;n"
"n"
"void main()n"
"{n"
"gl_Position = position;n"
"}n";
std::string fragmentShader =
"#version 330 coren"
"n"
"layout(location = 0) out vec4 color;n"
"n"
"void main()n"
"{n"
"color = vec4(1.0, 0.0, 0.0, 1.0);n"
"}n";
unsigned int shader = Display::Create_Shader(vertexShader, fragmentShader);
glBindBuffer(GL_ARRAY_BUFFER, 0);
while (!glfwWindowShouldClose(Display::window))
{
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader);
// draw points 0-3 from the currently bound VAO with current in-use shader
glDrawArrays(GL_TRIANGLES, 0, 3);
/* Swap front and back buffers */
glfwSwapBuffers(Display::window);
/* Poll for and process events */
glfwPollEvents();
Display::GLCheckError();
}
glfwTerminate();
return 0;
}
我还有一个Display.cpp文件,但这只是为了解析GLFW窗口符号。
1条答案
按热度按时间68de4m5k1#
坐标定义的不是三角形,而是一条直线。因此,不会渲染任何三角形基本体。更改坐标:
dis->Create_Buffer(-0.5f, -0.5f, 0.0f, -0.5f, 0.5f, -0.5f, buffer);