首页 > 编程语言 >第三个OpenGL程序,shaders _ 后续 之 moreAttribute (设置顶点位置属性 颜色位置属性),从顶点数据中传入顶点数据,顶点颜色

第三个OpenGL程序,shaders _ 后续 之 moreAttribute (设置顶点位置属性 颜色位置属性),从顶点数据中传入顶点数据,顶点颜色

时间:2024-04-04 23:44:33浏览次数:15  
标签:ourColor 颜色 0.0 0.5 vec3 顶点 1.0 属性

效果:

 

代码 main.cpp

#include <iostream>
#include <glad/glad.h>
#include <glfw3.h>
#include <math.h>

using namespace std;

// 回调函数,每当窗口改变大小,视口大小也跟随改变
void framebuffer_size_callback(GLFWwindow* window,int width,int height)
{
    glViewport(0,0,width,height);
}

// 输入 在GLFW中实现一些输入控制
void processInput(GLFWwindow *window)
{
    if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS)     // 是否按下了返回键(Esc)
    {
        glfwSetWindowShouldClose(window,true);               // 把WindowShouldClose属性设置为 true来关闭GLFW
    }
}
// ************** opengl 具体实现 ************
// 顶点数据
float vertices[] = {
    // 位置              // 颜色
    0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   // 右下
    -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   // 左下
    0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f    // 顶部
};
// 顶点着色器源码
const char *vertexShderSource =
    "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"     // 位置变量的属性位置值为 0
    "layout (location = 1) in vec3 aColor;\n"   // 颜色变量的属性位置值为 1
    "out vec3 ourColor;"                        // 向片段着色器输出一个颜色
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos,1.0);\n"        // 把一个vec3作为vec4的构造器的参数
    "   ourColor = aColor;\n"                   // 将ourColor设置为我们从顶点数据那里得到的输入颜色
    "}\0";
// 片段着色器源码
const char *fragmentShaderSource =
    "#version 330 core\n"
    "out vec4 FragColor;\n"
    "in vec3  ourColor;\n"                     // 从顶点着色器传来的输入变量(名称相同、类型相同)
    "void main()\n"
    "{\n"
    "   FragColor = vec4(ourColor,1.0);\n"
    "}\0";
//******************************************
int main()
{
    cout << "shaders" << endl;

    // GLFW (窗口)
    glfwInit();                                                         // 初始化GLFW
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);                       // 主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);                       // 次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);       // 使用核心模式
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); Mac OS X系统

    // 创建一个GLFW窗口对象
    GLFWwindow* window = glfwCreateWindow(800,600,"shaders",NULL,NULL);
    if(window == NULL)
    {
        std::cout<< "Failed to create GLFW window"<<std::endl;
        glfwTerminate();
        return -1;
    }
    glfwMakeContextCurrent(window);                              // 窗口的上下文设置为当前线程的主上下文

    // GLAD
    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))      // 初始化GLAD(初始化OpenGL函数指针)
    {
        std::cout<<"Failed to initialize GLAD"<<std::endl;
        return -1;
    }

    //*********** opengl 具体实现 ******************
    // 顶点数组对象 VAO
    unsigned int VAO;
    glGenVertexArrays(1,&VAO);   // 创建顶点数组对象
    glBindVertexArray(VAO);      // 绑定顶点数组对象
    // 顶点缓冲对象 VBO
    unsigned int VBO;
    glGenBuffers(1,&VBO);
    glBindBuffer(GL_ARRAY_BUFFER,VBO);                                       // 绑定顶点缓冲对象
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);  // 把之前定义的顶点数据复制到缓冲的内存中

    // 顶点着色器对象
    unsigned int vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);           // 创建顶点着色器对象
    glShaderSource(vertexShader,1,&vertexShderSource,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::vertex::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);
    }

    // 把着色器对象链接到程序对象以后,删除着色器对象
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    // 使用着色器程序对象
    glUseProgram(shaderProgram);


    // 位置属性 0 来自顶点着色器的location = 0
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
    glEnableVertexAttribArray(0);
    // 颜色属性 1 来自顶点着色器的location = 1
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
    glEnableVertexAttribArray(1);

    //**************************




    // 视口
    glViewport(0,0,800,600);

    // 视口跟随窗口大小改变
    glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);

    // 渲染循环
    while(!glfwWindowShouldClose(window))                            // 检查GLFW是否被要求退出
    {
        // 输入 (用户)
        processInput(window);                                        // 输入控制(自定义)

        //************** 渲染指令 (用户)**********

        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shaderProgram);
        float timeValue = glfwGetTime();
        float greenValue = (sin(timeValue) / 2.0f) + 0.5f;
        int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
        glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES,0,3);

        //***************************************

        // 检查并调用事件,交换缓冲 (默认操作)
        glfwSwapBuffers(window);                                     // 交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。
        glfwPollEvents();                                            // 有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态
    }

    // 解绑 VAO  VBO 着色器程序对象
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteProgram(shaderProgram);

    // 当渲染循环结束后我们需要正确释放/删除之前的分配的所有资源
    glfwTerminate();
    return 0;
}

 

标签:ourColor,颜色,0.0,0.5,vec3,顶点,1.0,属性
From: https://www.cnblogs.com/RedWetPlace/p/18115341

相关文章

  • day18java学习打卡:类中属性的使用
    /* *类中属性的使用: *  *属性(成员变量) vs 局部变量 *1.相同点: * 1.1定义变量的格式:数据类型变量名=变量值; * 1.2先声明,后使用 * 1.3变量都有其对应的作用域 *  *  *2.不同点: * 2.1在类中声明的位置不同 *   属性:直接......
  • 网页前端之html表单相关属性
                      表单input标签和表单相关属性        学习过HTML的朋友都会了解到,想要制作一个表单,我们首先要有一个最外层的容器来容纳我们用HTML所写的编程语句,所以今天我们所学的第一个HTML标签就是<form>标签。  ......
  • 定义一棵松弛红黑树及其根结点颜色转换后的影响
    定义一棵松弛红黑树及其根结点颜色转换后的影响1.红黑树的性质2.松弛红黑树的定义3.根节点颜色变化的影响4.伪代码实现5.C语言代码实现6.结论在计算机科学中,红黑树是一种自平衡的二叉搜索树,它在许多数据结构和算法问题中都有着广泛的应用。红黑树通过一系列精心......
  • HTML标签属性
    ​ HTML(超文本标记语言)标签的属性为网页元素定义了额外的信息,用于调整元素的行为或外观。每个HTML标签都可以有多个属性,但某些属性只适用于特定的标签。属性提供了丰富的方式来控制HTML元素的行为和表示,是Web开发中不可或缺的部分。通过合理使用这些属性,可以提升网页的功能性、......
  • Opencv各个颜色空间、用途(颜色通道分割与合并)
    Opencv各个颜色空间、用途(颜色通道分割与合并)OpenCV中提供了多种颜色空间,每种颜色空间都有其特定的用途。以下是一些常见的颜色空间及其用途:BGR颜色空间:BGR颜色空间是一种与计算机显示器显示的颜色相同的颜色空间。它由蓝色、绿色和红色通道组成,通常用于图像处理和计算机......
  • nextjs 的函数,参数,属性装饰器的使用
    //属性装饰器constdoc1:PropertyDecorator=(target:any,val:string|symbol)=>{console.log(target);console.log(val);val="覆盖";}//方法装饰器constdoc2:MethodDecorator=(target:any,val:string|symbol,desc:any)=>{cons......
  • Java登陆第三十七天——VUE3插值表达式、文本渲染、属性渲染、事件绑定
    插值表达式VUE中最基本的数据绑定形式。语法格式如下:{{数据来源}}插值表达式的特点:不依靠标签。可以调用函数。支持运算符。栗子App.vue<scriptsetup>letmsg="字符串";letnum=10;functionf1(){return"有返回值的方法"}letf2=()=>{......
  • 2024-04-03:用go语言,在一个小城市里,有 m 个房子排成一排, 你需要给每个房子涂上 n 种颜
    2024-04-03:用go语言,在一个小城市里,有m个房子排成一排,你需要给每个房子涂上n种颜色之一(颜色编号为1到n),有的房子去年夏天已经涂过颜色了,所以这些房子不可以被重新涂色,我们将连续相同颜色尽可能多的房子称为一个街区。比方说houses=[1,2,2,3,3,2,1,1],它包含5个街......
  • WHAT - 值得掌握的 computed 计算属性机制
    目录一、介绍二、计算属性vs方法:缓存优势三、计算属性vswatch1.主要区别:目的和用法2.watch性能问题四、计算属性底层实现五、计算属性只读和可写六、最佳实践1.不应该有副作用2.避免直接修改计算属性值一、介绍参考阅读:vue3官方文档......
  • DOM中的一些属性
    获取属性节点对象:      getAttributeNode(不常用)    增加属性节点:      节点对象.setAttribute('属性名','属性值')    删除属性节点:      节点对象.removeAttribute('属性名')    修改属性节点:  ......