文章目录

  • 一、目的
  • 二、结果
  • 三、详细过程
  • 下载

一、目的

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着色器画方形并且填颜色相关推荐

  1. OpenGL从入门到精通--着色器的使用

    着色器 github源码仓库 opengl环境准备 opengl编程从入门到精通-hello,window OpenGL从入门到精通–你好三角形 OpenGL从入门到精通–着色器的使用 着色器(Sha ...

  2. Shader入门---曲面细分着色器和几何着色器

    Shader入门-曲面细分着色器和几何着色器 前记:学不可以停止-------------------------------mx 基础知识: 曲面细分着色器:可以将一个几何体细化为一个球体也能将一根 ...

  3. 【OpenGL基础】|| 着色器介绍

    文章目录 1. GLSL 2. 数据类型 3. 输入与输出 4. uniform变量 5. 更多属性 着色器(shader)是运行在GPU上的小程序,将输入转化为输出.着色器之间不能相互通信,唯一的沟 ...

  4. OpenGL播放yuv数据流(着色器SHADER)-IOS(一)

    OpenGL播放yuv数据流(着色器SHADER)-IOS(一) 和windows平台的类似,只是用object-c编写的,着色器语言shader,rgb转yuv有些不同,具体看代码注释. //.h ...

  5. OpenGL播放yuv数据流(着色器SHADER)-windows(一)

    OpenGL播放yuv数据流(着色器SHADER)-windows(一) 在写这篇文章之前首先要感谢老雷,http://blog.csdn.net/leixiaohua1020/article/det ...

  6. Unity3d基础知识之Texture纹理、Shader着色器、Material材质、Rendering Mode

    Unity3d基础知识之Texture纹理.Shader着色器.Material材质.Rendering Mode 一.纹理.着色器与材质 Texture(纹理):应用于网格表面上的标准位图图像.Un ...

  7. OpenGL ES渲染管线与着色器

    转自:http://blog.csdn.net/kesalin/article/details/8223649 [OpenGL ES 02]OpenGL ES渲染管线与着色器 罗朝辉 (http:// ...

  8. Lesson3 Shader着色器

    2019独角兽企业重金招聘Python工程师标准>>> Shader(着色器): 它是图形硬件设备所执行的一类特殊函数,可以把它看作专为图形处理单元(GPU)编译的一种小型程序.Op ...

  9. Unity Shader着色器优化

    对游戏开发者而言,着色器长久以来就是游戏开发中的重要部分,在Unity中编写并实现着色器的过程直观且高效,优秀的着色器还可以创造非常精美的游戏画面,同时保证极高的性能.今天将由Unity的技术工程师张 ...

最新文章

  1. 【FFmpeg】ffmpeg工具源码分析(二):转码核心函数 transcode
  2. java.io.IOException: No space left on device
  3. 双屏全屏跳回到主屏_双屏笔记本了解下?剪视频不要太好使
  4. 计算机专业毕业了,还要不要参加培训班
  5. 8卡gpu服务器是8个芯片,GPU服务器 4GPU 8GPU 运算卡
  6. 羽毛球击球点与自身位置[羽球技术入门必读]
  7. Android下的特殊文件夹
  8. JQuery拖拽通过八个点改变div大小
  9. 苹果电脑如何打印文件
  10. 2020第二周美赛感想
  11. CTEX零基础基础入门Latex
  12. Android工作经验三年总结。(零基础自学Android)
  13. Install Windows XP without CDrom
  14. 热式气体质量流量计检定规程_最佳实践:热式质量流量计实际标定的安全性和准确性...
  15. Kaggle系列-IEEE-CIS Fraud Detection第一名复现
  16. Cisco NAC介绍
  17. 向日葵Linux远程失败,向日葵远程控制客户端无法安装的问题解决方式
  18. 电脑配置单(自用勿删)
  19. 人生不问长短,但求白首同心之人
  20. 如何启用服务器的TCP IP协议,本地联接的属性里的TCP/IP协议被禁用,怎么开启啊?...

热门文章

  1. opensips代码分析
  2. java16进制字符串与字符串互相转换
  3. 苹果手机代数_讲知识:苹果手机已十年 命名规则多幻变
  4. Java zip解压工具类
  5. umi中@umijs/plugin-dva的使用,及实现一套增删改
  6. 域名证书到期监控告知
  7. 自行车无级变速器设计
  8. 创业投资——IDG技术创业投资基金
  9. 海明码(汉明码)详解
  10. 如何用AR Engine开发一个虚拟形象表情包?