Opengl入门基础-shader着色器画方形并且填颜色
文章目录
- 一、目的
- 二、结果
- 三、详细过程
- 下载
一、目的
opengl shader画方形并且填颜色
二、结果
成功画方形并用shader填充彩色
三、详细过程
https://blog.csdn.net/xiuyuandashen/article/details/107670502 着色器例子
—渲染管道
1顶点着色器,不关心图元(顶点着色器)
Vertex Shader可以操作的属性有:位置、颜色、纹理坐标,但是不能创建新的顶点。
输出gl_Position,gl_FrontFacing 和 gl_PointSize。
fragment shader 片元着色器中没有属性
Pixel Shader 像素着色器就是Fragment Shader(片元着色器).计算每个像素的颜色和其它属性
输出gl_FragColor
Geometry Shader(几何着色器)是Shader Model 4引入的新的着色器
compute Shader由Shader Model 5引入的提供通用计算能力的着色器
-----GLSL
https://www.jianshu.com/p/a7bc9020f0a3 可以放到文件读取
uniform 数据类型 变量名;
uniform表示全局的数据(应用里也能读取和写入这个变量,这就是着色器和应用之间互通数据的方法)
https://www.cnblogs.com/MakeView660/p/10654576.html
理解:
layout(location=0) in vec3 aPos;//location=0表示从计算机获取无数个坐标点的坐标值,放在vec3别名是aPos,vec3表示这个数组是三维数组
vertexColor=vec4(0.5,0.0,0.0,1.0);表示这是一个4维数组,给颜色,传给片元着色器,他们一个个着色器,只能从第一个传数据给第二个,就像单片机fpga一样。 但是 uniform,可以在任意着色器传值,可以直接给片元传颜色
在设置vbo最后一个步骤,时候,glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,6sizeof(float),(void)0);
0代表第几个属性,例如坐标,这个GLSL里面location=0对应,3表示是三维坐标,GL_FALSE,6sizeof(float),表示坐标和颜色都是三维,所以占缓冲6个float空间,(void)0表示偏移动量,由于顶点着色器是从0开始的,片元着色器偏移量(void*)(3*sizeof(float))因为顶点着色器的坐标占了3个位置。
理解,我觉得3不是表示偏移量,而是我们给的坐标点的数量
https://blog.csdn.net/weixin_37459951/article/details/96433508 对glVertexAttribPointer有点启发,这里面将坐标和颜色都放数组vertices[]里面了,所以是3和4,第二个参数也是这个道理,说的是vertices的坐标和颜色是多少维数组,就是说跟GLSL没啥关系
改成:const GLfloat vertices[]{
-0.5f,-0.5f,0.0f,1.0f,1.0f, 0.0f, 0.0f, 1.0f,
0.5f,-0.5f,0.0f,1.0f, 0.0f, 1.0f, 0.0f, 1.0f,
0.5f,0.5f,0.0f,1.0f, 0.0f, 0.0f, 1.0f, 1.0f,
-0.5f,0.5f,0.0f,1.0f,1.0f, 0.0f, 0.0f, 1.0f,
};
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE,8* sizeof(float), (void*)(4* sizeof(float)));
glEnableVertexAttribArray(1);
结果:得到想要的彩色方块
2几何处理器,根据顶点的相邻关系生成多图元
3裁剪,将超出屏幕的数据掉
4光栅化,将顶点渲染到屏幕
1.0设置你将来需要着色什么内容
const char* vertexShaderSource =
“#version 330 core \n”
// 0号栏位读取顶点坐标
“layout (location = 0) in vec3 aPos; \n”
//1号栏位读取颜色颜色
"layout (location = 1) in vec3 aColor; "
“out vec4 vertexColor; \n”
“void main() \n”
“{ \n”
// gl_Position 是固定的名称 用来保存 顶点坐标的
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); \n"
" vertexColor = vec4(aColor.x,aColor.y,aColor.z,1.0); \n"
“} \n”;
1.1创建着顶点色器对象
// 顶点着色器
unsigned int vertexShader;
// 创建这个着色器
vertexShader = glCreateShader(GL_VERTEX_SHADER);
1.2绑定着色器空间
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
1.3编译着色器
glCompileShader(vertexShader);
2.0设置你将来需要着色什么内容
const char* fragmentShaderSource =
“#version 330 core \n”
"out vec4 FragColor; \n""uniform vec4 outColor; \n""in vec4 vertexColor; \n""void main() \n""{ \n"" FragColor = vertexColor; \n""} \n";
2.1创建片元着色器
// 片段着色器
unsigned int fragmentShader;
// 创建这个着色器
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
2.2绑定着色器
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
2.3编译着色器
// 编译
glCompileShader(fragmentShader);
3.1创建着色器程序对象
// 着色器程序 是将多个着色器合并之后并最终链接完成的版本
unsigned int shaderProgram;
// 创建一个着色器程序对象
shaderProgram = glCreateProgram();
3.2将之前的着色器放进程序
// 将之前编译的着色器附加到程序对象上
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
3.3链接着色器程序
// 用glLinkProgram链接它们
glLinkProgram(shaderProgram);
4在窗口循环里调用着色器程序
glUseProgram(shaderProgram);
5绘画
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
ps:上一章vao和vbo都要照旧放数据
-------------按照原来画方形代码,结果方形变成黑色没其他变化???
我找代码区别发现vbo最后设置顶点属性,和启动顶点属性两个方法改变了有效果
原来 :glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
改成:glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
// 以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的
//读取到0号栏位上
glEnableVertexAttribArray(0);
// 读取颜色属性 从 1号栏位 开始 将数据每三个为一组 单位为float 每次跳6float字节 偏移为3个float
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void)(3 * sizeof(float)));
// 读取到1号栏位上
glEnableVertexAttribArray(1);
结果:得到两个三角形,彩色
改成: glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 4* sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
—————————调用glDrawElements(GL_TRIANGLE_FAN, 8, GL_UNSIGNED_INT, 0);报错
0x6923A833 (atioglxx.dll)处(位于 Project4.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
https://blog.csdn.net/liujianxun111/article/details/79010938
原因是没有赋予索引指针,函数的最后一参数
原来错的:
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
改成:
const GLubyte indices[] = { 0, 1, 2, 3 };//glDrawElements的最后一个参数,代表索引指针,表示 vertices[]顶点数组有多少个顶点
glDrawElements(GL_TRIANGLE_FAN, 4, GL_UNSIGNED_BYTE, indices);
结果:成功变成彩色方形
下载
https://pan.baidu.com/s/1neyfVOGW2VQAUZKC8CKLug?pwd=w1p6
有问题可以找鸡肉大大
Opengl入门基础-shader着色器画方形并且填颜色相关推荐
- OpenGL从入门到精通--着色器的使用
着色器 github源码仓库 opengl环境准备 opengl编程从入门到精通-hello,window OpenGL从入门到精通–你好三角形 OpenGL从入门到精通–着色器的使用 着色器(Sha ...
- Shader入门---曲面细分着色器和几何着色器
Shader入门-曲面细分着色器和几何着色器 前记:学不可以停止-------------------------------mx 基础知识: 曲面细分着色器:可以将一个几何体细化为一个球体也能将一根 ...
- 【OpenGL基础】|| 着色器介绍
文章目录 1. GLSL 2. 数据类型 3. 输入与输出 4. uniform变量 5. 更多属性 着色器(shader)是运行在GPU上的小程序,将输入转化为输出.着色器之间不能相互通信,唯一的沟 ...
- OpenGL播放yuv数据流(着色器SHADER)-IOS(一)
OpenGL播放yuv数据流(着色器SHADER)-IOS(一) 和windows平台的类似,只是用object-c编写的,着色器语言shader,rgb转yuv有些不同,具体看代码注释. //.h ...
- OpenGL播放yuv数据流(着色器SHADER)-windows(一)
OpenGL播放yuv数据流(着色器SHADER)-windows(一) 在写这篇文章之前首先要感谢老雷,http://blog.csdn.net/leixiaohua1020/article/det ...
- Unity3d基础知识之Texture纹理、Shader着色器、Material材质、Rendering Mode
Unity3d基础知识之Texture纹理.Shader着色器.Material材质.Rendering Mode 一.纹理.着色器与材质 Texture(纹理):应用于网格表面上的标准位图图像.Un ...
- OpenGL ES渲染管线与着色器
转自:http://blog.csdn.net/kesalin/article/details/8223649 [OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http:// ...
- Lesson3 Shader着色器
2019独角兽企业重金招聘Python工程师标准>>> Shader(着色器): 它是图形硬件设备所执行的一类特殊函数,可以把它看作专为图形处理单元(GPU)编译的一种小型程序.Op ...
- Unity Shader着色器优化
对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...
最新文章
- 【FFmpeg】ffmpeg工具源码分析(二):转码核心函数 transcode
- java.io.IOException: No space left on device
- 双屏全屏跳回到主屏_双屏笔记本了解下?剪视频不要太好使
- 计算机专业毕业了,还要不要参加培训班
- 8卡gpu服务器是8个芯片,GPU服务器 4GPU 8GPU 运算卡
- 羽毛球击球点与自身位置[羽球技术入门必读]
- Android下的特殊文件夹
- JQuery拖拽通过八个点改变div大小
- 苹果电脑如何打印文件
- 2020第二周美赛感想
- CTEX零基础基础入门Latex
- Android工作经验三年总结。(零基础自学Android)
- Install Windows XP without CDrom
- 热式气体质量流量计检定规程_最佳实践:热式质量流量计实际标定的安全性和准确性...
- Kaggle系列-IEEE-CIS Fraud Detection第一名复现
- Cisco NAC介绍
- 向日葵Linux远程失败,向日葵远程控制客户端无法安装的问题解决方式
- 电脑配置单(自用勿删)
- 人生不问长短,但求白首同心之人
- 如何启用服务器的TCP IP协议,本地联接的属性里的TCP/IP协议被禁用,怎么开启啊?...