首页 > 其他分享 >OpenGL:三角形的诞生

OpenGL:三角形的诞生

时间:2024-06-01 19:00:11浏览次数:30  
标签:绑定 诞生 OpenGL 顶点 三角形 GL 着色器 属性

先放一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分:

顶点缓冲对象(VBO)

所有的顶点数据(位置、纹理、法线等)都需要存储在GPU上,OpenGL通过顶点缓冲对象管理这个内存。其声明和绑定的代码函数如下:

unsigned int vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);

设置顶点属性

在绑定VBO时,我们只是指定了一堆数据,但是对于其内存布局(layout)完全未知,为了让机器知道顶点属性,我们还需如下代码(这两行代码的顺序无所谓):

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

每个索引都可以绑定一种属性,比如上面的例子就是将每2个连续的float作为一组属性绑定在索引0上,这里的索引0在后面的顶点着色器中也会使用到。
代码中并没有指明这个属性具体是什么属性,比如位置还是法线等,它只是一组属性并且被绑定在了索引上。

你可能会觉得很奇怪,没有指明哪个内存空间就直接设置属性。这也是OpenGL状态机的体现,只要在GL_ARRAY_BUFFER上绑定的VBO,那么这个属性就对应的是这个VBO。

着色器(shader)

着色器简单来说就是运行在显卡上的一段小程序,我们可以通过编程控制器输入输出进而控制图像的显示。OpenGL着色器是用OpenGL着色器语言(OpenGL Shading Language, GLSL)写成的,它是一种类C语言。

就目前而言,我们最需要了解的着色器就两个:顶点着色器和片段着色器。简单来说,我们首先在CPU上定义了顶点数据,之后将其转移到显存上(通过VBO),之后需要通过顶点着色器(一段小程序,对每个顶点都运行一次)处理顶点数据,并将必要的数据输出,再之后就是片段着色器(计算颜色等,对每个光栅块处理一次)进行处理,最后通过混合显示图像。

着色器间不能相互通信,它们之间唯一的沟通只有通过输入和输出。GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,

标签:绑定,诞生,OpenGL,顶点,三角形,GL,着色器,属性
From: https://www.cnblogs.com/warren-j1an/p/18225096

相关文章

  • 全球首个多语种手语视频生成模型诞生:SignLLM
    近日,一项名为SignLLM的新型AI技术取得了突破性进展,或将彻底改变听障人士的沟通方式。作为全球首个多语种手语生成模型,SignLLM能够将输入的文本或语音指令,实时转化为对应的手语手势视频,为打破语言障碍、促进信息无障碍传播带来了革命性希望。全球首个文本转多语种手......
  • OpenGL:一个黑框的诞生
    OpenGL并不是API,它不包含任何代码,仅仅只是一个关于输入输出的标准。关于OpenGL的具体实现则是由各个开发商负责。OpenGL是以状态机的方式进行控制,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会......
  • css画箭头,三角形
    箭头.arrow{border:solidblack;border-width:01px1px0;display:inline-block;padding:4px;}//向上.up{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);}//向下.down{transform:rotate(45deg);-webkit-transform:r......
  • 【OpenGL高级】实例化多物体绘制
      一、说明  对于海量而相近物体渲染,如果用buffer直接渲染,其庞大的存储数据将能把整个系统资源耗光。而可行的,用少量模式数据去生成临时显示的数据这样用少量局部变量就能在循环内部完成,本篇将阐述如何去实现。二、实例化渲染  计算机图形学中的实例化是指使用......
  • [数字三角形]方格取数
    设有N×N的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从A点到B点共走了两次,试找出......
  • [数字三角形模型]最低通行费用
    题目描述一个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 (2N−1) 个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商......
  • 计算机图形:三角形光栅化
    目录三角形光栅化绘制三角形轮廓填充三角形内部处理公共边界参考三角形光栅化光栅化是将几何数据经一系列变换,最终转换为像素,而在屏幕上显示的过程.直线光栅化,在2D屏幕上,对两端点间插值,绘制一条直线(段).常用中点算法和Bresenham算法,Bresensham算法参见Bresenham画直线算法(所有......
  • 三角形最小路径和
    题源:IOI飞入寻常百姓家classSolution:defminimumTotal(self,triangle:List[List[int]])->int:n=len(triangle)dp=[[0]*(i+1)foriinrange(n)]dp[0][0]=triangle[0][0]foriinrange(1,n):dp[i][0]......
  • 杨辉三角形
    用C语言实现打印出10行杨辉三角形111121133114641151010511、第一列都为1,第x行第x列为12、第几行就有几个元素3、从第三行开始,第二列的元素等于第二行的第一列元素+第二列元素之和(排除从第三行开始的首和尾元素)#include<stdio.h>intmain(){in......
  • 使QOpenGLWidget的背景透明
    方法其实Qt帮助文档已经说了,如下图。大意是如果你想让QOpenGLWidget下方的子Widget可见只需要设置Qt::WA_AlwaysStackOnTop属性就行了;如果QOpenGLWidget下方没有子Widget,只是想创建一个半透明的窗口,那么对顶层窗口(主窗口)使用传统的Qt::WA_TranslucentBackground属性就可以实现了。......