我正在尝试将一个简单的四边形渲染到屏幕上:
#include <SDL.h>
#include <GL/glew.h>
#include <SDL_opengl.h>
#include <iostream>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
int mouse_x, mouse_y;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_GLContext context = NULL;
const char* vertexShaderSource =
"#version 460\n"
"layout(location = 0) in vec3 aPos;\n"
"void main(){\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\n";
const char* fragmentShaderSource =
"#version 460\n"
"out vec4 FragColor;\n"
"void main(){\n"
" FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
"}\n";
int main(int argv, char* argc[])
{
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Init(SDL_VIDEO_OPENGL);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 6);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
window = SDL_CreateWindow("SDL Julia Set Renderer", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_OPENGL);
context = SDL_GL_CreateContext(window);
glewInit();
glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
if (!success)
{
glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
}
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if (!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
float verts[] =
{
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
int indices[] =
{
0, 1, 3,
1, 2, 3
};
unsigned int VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &EBO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, EBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);
glEnableVertexAttribArray(0);
bool isrunning = true;
while (isrunning)
{
SDL_Event event;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
isrunning = false;
}
}
//Main Loop
SDL_GetMouseState(&mouse_x, &mouse_y);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
//glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
/*
Here's where the error took place
*/
SDL_GL_SwapWindow(window);
}
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &VBO);
glDeleteProgram(shaderProgram);
SDL_Quit();
return 0;
}
字符串
.然而,我的代码一直在SDL_GL_SwapWindow(window)中抛出错误:
Exception thrown at 0x00007FF9C6E74A40 (nvoglv64.dll) in SDL Julia Set Renderer.exe: 0xC0000005: Access violation reading location 0x0000000000000000.
型
这个错误只是在我为EBO编写代码之后才开始出现的,所以我假设我在那里做错了什么。
我尝试更新我的NVIDIA驱动程序。
1条答案
按热度按时间30byixjq1#
在 VAO 设置过程中,您需要小心将哪个缓冲区绑定到哪个绑定点。
glVertexAttribPointer
对当前绑定到GL_ARRAY_BUFFER
的缓冲区进行操作,但由于您还将EBO绑定到该绑定点,因此现在您将在EBO和顶点属性之间建立连接。通常,EBO需要绑定到GL_ELEMENT_ARRAY_BUFFER
。更正后的代码应如下所示:字符串