You need to enable JavaScript to run this app.
最新活动
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用着色器绘制多个对象(GLEW)

以下是使用GLEW库编写使用着色器绘制多个对象的代码示例:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

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;
    uniform vec3 objectColor;
    void main()
    {
        FragColor = vec4(objectColor, 1.0);
    }
)";

float vertices1[] = {
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f,  0.5f, 0.0f
};

float vertices2[] = {
    0.0f, -0.5f, 0.0f,
    0.8f, -0.5f, 0.0f,
    0.4f,  0.5f, 0.0f
};

void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}

void processInput(GLFWwindow* window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "Multiple Objects with Shaders (GLEW)", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }

    glfwMakeContextCurrent(window);
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

    if (glewInit() != GLEW_OK)
    {
        std::cout << "Failed to initialize GLEW" << std::endl;
        return -1;
    }

    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);

    GLuint VAO1, VBO1;
    glGenVertexArrays(1, &VAO1);
    glGenBuffers(1, &VBO1);

    glBindVertexArray(VAO1);
    glBindBuffer(GL_ARRAY_BUFFER, VBO1);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glBindVertexArray(0); // unbind VAO

    GLuint VAO2, VBO2;
    glGenVertexArrays(1, &VAO2);
    glGenBuffers(1, &VBO2);

    glBindVertexArray(VAO2);
    glBindBuffer(GL_ARRAY_BUFFER, VBO2);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);

    glBindVertexArray(0); // unbind VAO

    while (!glfwWindowShouldClose(window))
    {
        processInput(window);

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glUseProgram(shaderProgram);

        glUniform3f(glGetUniformLocation(shaderProgram, "objectColor"), 1.0f, 0.5f, 0.2f);
        glBindVertexArray(VAO1);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glUniform3f(glGetUniformLocation(shaderProgram, "object
本文内容通过AI工具匹配关键字智能整合而成,仅供参考,火山引擎不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系service@volcengine.com进行反馈,火山引擎收到您的反馈后将及时答复和处理。
展开更多
面向开发者的云福利中心,ECS 60元/年,域名1元起,助力开发者快速在云上构建可靠应用

社区干货

OpenGl开发图形绘制详解

使用此方法来执行只需要发生一次的操作,比如设置OpenGL的环境参数或初始化的OpenGL图形对象。- onDrawFrame():系统调用上的每个重绘此方法GLSurfaceView。使用此方法作为主要执行点用于绘制(和重新绘制)的图形对象... 将顶点和颜色数据转换为OpenGl使用的数据格式 - 加载顶点找色器和片段着色器用来修改图形的颜色,纹理,坐标等属性 - 创建投影和相机视图来显示视图的显示状态,并将投影和相机视图的转换传递给着色器。 ...

观点|词云指北(上):谈谈词云算法的发展

也有一些工作使用 颜色、透明度等作为词频的冗余编码(指对同一维度同时使用多个通道进行编码), 或者表示除词频外的其他信息。例如,使用颜色编码聚类信息,如下图中,使用颜色编码来自同一文章的单词。 ![pict... ### 形状词云主要有两个应用领域,一个是基于地理位置的词云,其核心为表达地理相关的信息,需要在忠实于地理信息的基础上提高词云的美观度。### 此处以 Geo Word Clouds 为例介绍,下图为针对法国各地特色奶酪构建...

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

使用着色器绘制多个对象(GLEW)-优选内容

OpenGl开发图形绘制详解
使用此方法来执行只需要发生一次的操作,比如设置OpenGL的环境参数或初始化的OpenGL图形对象。- onDrawFrame():系统调用上的每个重绘此方法GLSurfaceView。使用此方法作为主要执行点用于绘制(和重新绘制)的图形对象... 将顶点和颜色数据转换为OpenGl使用的数据格式 - 加载顶点找色器和片段着色器用来修改图形的颜色,纹理,坐标等属性 - 创建投影和相机视图来显示视图的显示状态,并将投影和相机视图的转换传递给着色器。 ...
观点|词云指北(上):谈谈词云算法的发展
也有一些工作使用 颜色、透明度等作为词频的冗余编码(指对同一维度同时使用多个通道进行编码), 或者表示除词频外的其他信息。例如,使用颜色编码聚类信息,如下图中,使用颜色编码来自同一文章的单词。 ![pict... ### 形状词云主要有两个应用领域,一个是基于地理位置的词云,其核心为表达地理相关的信息,需要在忠实于地理信息的基础上提高词云的美观度。### 此处以 Geo Word Clouds 为例介绍,下图为针对法国各地特色奶酪构建...
数字大屏3D地图-组件问题排查手册
一般是由浏览器配置或硬件显卡不支持WebGL2.0解析导致的。请您根据具体问题,选择合适的解决方案。 2.1 浏览器没有开启硬件加速Windows常见的问题是浏览器没有开启硬件加速,如不开启则使用的 CPU Swiftshader 软解码... 则证明不是浏览器或者配置的原因,可能需要更换电脑显卡。如上图,显卡 Intel(R)HD Graphics不支持 OpenGL 3.0,地图绘制的WebGL2基于 OpenGL3.0 着色器语言,结论显卡配置过低。 附: 查看显卡支持 网站 当断网/隔离公...

使用着色器绘制多个对象(GLEW)-相关内容

特惠活动

热门爆款云服务器

100%性能独享,更高内存性能更佳,学习测试、web前端、企业应用首选,每日花费低至0.55元
60.00/1212.00/年
立即购买

域名注册服务

cn/top/com等热门域名,首年低至1元,邮箱建站必选
1.00/首年起32.00/首年起
立即购买

DCDN国内流量包100G

同时抵扣CDN与DCDN两种流量消耗,加速分发更实惠
2.00/20.00/年
立即购买

产品体验

体验中心

云服务器特惠

云服务器
云服务器ECS新人特惠
立即抢购

白皮书

一图详解大模型
浓缩大模型架构,厘清生产和应用链路关系
立即获取

最新活动

爆款1核2G共享型服务器

首年60元,每月仅需5元,限量秒杀
立即抢购

火山引擎增长体验专区

丰富能力激励企业快速增长
查看详情

数据智能VeDI

易用的高性能大数据产品家族
了解详情

一键开启云上增长新空间

立即咨询