未显示现代OpenGL + SDL2三角形是指使用SDL2库和现代OpenGL技术来绘制一个三角形,但是该三角形不会在屏幕上显示出来。
现代OpenGL是指OpenGL 3.0及以上版本,它引入了一些新的特性和改进,使得图形渲染更加高效和灵活。
SDL2是一个跨平台的多媒体库,它提供了对窗口、图像、音频、输入设备等的统一抽象,方便开发者进行跨平台的游戏和图形应用程序开发。
在使用SDL2和现代OpenGL绘制三角形之前,需要进行以下几个步骤:
完整的代码示例如下:
#include <SDL2/SDL.h>
#include <OpenGL/gl3.h>
int main(int argc, char* argv[]) {
// 初始化SDL2库
SDL_Init(SDL_INIT_VIDEO);
// 创建窗口
SDL_Window* window = SDL_CreateWindow("Triangle", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 800, 600, SDL_WINDOW_OPENGL);
// 创建OpenGL上下文
SDL_GLContext context = SDL_GL_CreateContext(window);
// 设置OpenGL状态
glViewport(0, 0, 800, 600);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
// 顶点着色器代码
const char* vertexShaderSource = R"(
#version 330 core
layout (location = 0) in vec3 aPos;
void main() {
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
)";
// 片段着色器代码
const char* fragmentShaderSource = R"(
#version 330 core
out vec4 FragColor;
void main() {
FragColor = vec4(1.0, 0.5, 0.2, 1.0);
}
)";
// 编译顶点着色器
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// 编译片段着色器
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// 创建着色器程序
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// 删除着色器对象
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// 创建顶点缓冲对象(VBO)
GLfloat vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 创建顶点数组对象(VAO)
GLuint VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
// 渲染循环
bool quit = false;
while (!quit) {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
quit = true;
}
}
// 清除颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT);
// 使用着色器程序
glUseProgram(shaderProgram);
// 绑定顶点数组对象(VAO)
glBindVertexArray(VAO);
// 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3);
// 解绑顶点数组对象(VAO)
glBindVertexArray(0);
// 刷新缓冲区
SDL_GL_SwapWindow(window);
}
// 删除顶点缓冲对象(VBO)和顶点数组对象(VAO)
glDeleteBuffers(1, &VBO);
glDeleteVertexArrays(1, &VAO);
// 删除着色器程序和OpenGL上下文
glDeleteProgram(shaderProgram);
SDL_GL_DeleteContext(context);
// 销毁窗口和SDL2库
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
这段代码使用SDL2创建了一个窗口,并在窗口中使用现代OpenGL绘制了一个橙色的三角形。在代码中,顶点着色器将顶点的位置传递给片段着色器,片段着色器将所有像素的颜色设置为橙色。然后,通过顶点缓冲对象(VBO)和顶点数组对象(VAO),将顶点数据传递给OpenGL进行绘制。
推荐的腾讯云相关产品和产品介绍链接地址:
请注意,以上链接仅供参考,具体选择产品时需要根据实际需求进行评估和决策。
领取专属 10元无门槛券
手把手带您无忧上云