[英]C++ OpenGL: Triangle doesnt appear in the screen
我正在按照教程使用 OpenGL 在屏幕上绘制三角形。 我已正确执行所有步骤,但我只得到一个绿屏,没有三角形。
这是我当前的代码。 DrawScene 在应用程序的初始化过程中被调用,并在每个 WM_DRAW 中调用 ResizeScene。 我的问题是:为什么我的代码没有显示三角形?
OpenGL 版本:4.6
#include "glew.h"
GLuint program;
GLuint VAO, VBO, EBO;
void DrawScene(HWND _hWnd);
void SetupShaders()
{
const char* vertexSource = {
"#version 130 core\n"
"layout (location = 0) in vec3 iPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(iPos, 1.0f);\n"
"}\n"
"\0"
};
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
const char* fragmentSource = {
"#version 130 core\n"
"out vec4 FragColor;\n"
"void main()\n"
"{\n"
" FragColor = vec4(1.0f, 0.0f, 1.0f, 1.0f);\n"
"}\n"
"\0"
};
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
program = glCreateProgram();
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glBindAttribLocation(program, 0, "iPos");
glLinkProgram(program);
}
void SetupBuffers()
{
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
float vertexData[] = {
0.0f, 0.0f, 0.0f,
10.0f, 10.0f, 0.0f,
10.0f, 0.0f, 0.0f,
0.0f, 10.0f, 0.0f
};
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
unsigned int indexData[] = {
0, 1, 2,
1, 2, 3
};
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexData), indexData, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(float) * 3, (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
void SetupScene(HWND& _hWnd)
{
static PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
{
sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
1, // Version Number
PFD_DRAW_TO_WINDOW | // Format Must Support Window
PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
PFD_DOUBLEBUFFER, // Must Support Double Buffering
PFD_TYPE_RGBA, // Request An RGBA Format
32, // Select Our Color Depth
0, 0, 0, 0, 0, 0, // Color Bits Ignored
0, // No Alpha Buffer
0, // Shift Bit Ignored
0, // No Accumulation Buffer
0, 0, 0, 0, // Accumulation Bits Ignored
16, // 16Bit Z-Buffer (Depth Buffer)
0, // No Stencil Buffer
0, // No Auxiliary Buffer
PFD_MAIN_PLANE, // Main Drawing Layer
0, // Reserved
};
HDC hdc = GetDC(_hWnd);
int pf = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, pf, &pfd);
HGLRC hglrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hglrc);
glewInit();
ShowWindow(_hWnd, SW_SHOW);
SetForegroundWindow(_hWnd);
SetFocus(_hWnd);
SetupShaders();
SetupBuffers();
}
void ResizeScene(HWND& _hWnd, size_t _width, size_t _height)
{
if (!_height)
{
_height = 1;
}
glViewport(0, 0, _width, _height);
DrawScene(_hWnd);
}
void DrawScene(HWND _hWnd)
{
HDC hdc = GetDC(_hWnd);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glUseProgram(program);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_BYTE, 0);
SwapBuffers(hdc);
}
您确实需要启用调试验证层并检查错误,因为您的代码中有一大堆容易发现的误解:
不要使用glBindAttribLocation
。 iPos
已经(正确地)绑定到布局位置 0,您只是在破坏它。
链接程序后,您没有分离和删除着色器程序,因此泄漏了 memory。
不要从您的顶点数组中取消绑定顶点和元素缓冲区,这是首先使用它的重点。
与 3 相关,不要在每次渲染时更改顶点数组的顶点和元素缓冲区。 您设置了一次顶点缓冲区。
您告诉 OpenGL 您的索引元素是glDrawElements
中的字节,而是将它们作为 32 位整数上传。 始终如一。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.