首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

未显示现代OpenGL + SDL2三角形

未显示现代OpenGL + SDL2三角形是指使用SDL2库和现代OpenGL技术来绘制一个三角形,但是该三角形不会在屏幕上显示出来。

现代OpenGL是指OpenGL 3.0及以上版本,它引入了一些新的特性和改进,使得图形渲染更加高效和灵活。

SDL2是一个跨平台的多媒体库,它提供了对窗口、图像、音频、输入设备等的统一抽象,方便开发者进行跨平台的游戏和图形应用程序开发。

在使用SDL2和现代OpenGL绘制三角形之前,需要进行以下几个步骤:

  1. 初始化SDL2库:包括初始化视频子系统、创建窗口和渲染器等。
  2. 创建OpenGL上下文:使用SDL2提供的函数创建一个与窗口关联的OpenGL上下文。
  3. 设置OpenGL状态:包括设置视口大小、清除颜色缓冲区、启用深度测试等。
  4. 编写顶点着色器和片段着色器:顶点着色器负责对顶点进行变换和处理,片段着色器负责对像素进行着色。
  5. 创建顶点缓冲对象(VBO)和顶点数组对象(VAO):VBO用于存储顶点数据,VAO用于管理顶点属性。
  6. 绘制三角形:使用glDrawArrays或glDrawElements函数绘制三角形。

完整的代码示例如下:

代码语言:cpp
复制
#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进行绘制。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种规模和业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的云数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接

请注意,以上链接仅供参考,具体选择产品时需要根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的沙龙

领券