OpenGL3.3高级GLSL

高级GLSL
这一篇写的有点水 直接复制过来的
glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), &data); 作用:主要是可以把顶点和法线之类的分开数组放 然后通过这个函数 将不同数组的数据存储进缓存// 范围: [24, 24 + sizeof(data)] (使用前要调用glBufferData 参数为NULL分配内存)
第一个参数是设置缓冲种类
第二个参数是偏移量 指定从何处开始填充这个缓冲(让我们插入或者更新缓冲内存的某一部分)也就是我们可以在缓冲中跨过一部分进行填充
都三个参数是数据大小
第四个参数是数据本身

gl_PointSize = 2.8; 在顶点着色器中添加 控制顶点的大小 但需要在需要在主程序中开启 glEnable(GL_PROGRAM_POINT_SIZE);

void *ptr = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);//获取缓冲指针的地址(再通过这个memcpy(ptr, data, sizeof(data));把数据复制给缓冲)

glUnmapBuffer(GL_ARRAY_BUFFER);//告诉系统不需要这个缓冲指针了

void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset,
GLintptr writeoffset, GLsizeiptr size);//复制缓冲的
第一个参数 复制源
第二个参数 复制目标的缓冲目标
第三个参数是偏移量
第四个参数 要传进去的数据大小
但是当第一个和第二个两个缓冲都是顶点缓冲的时候就不能两个位置都写顶点缓冲 这个时候可以绑定两个缓冲GL_COPY_READ_BUFFER和GL_COPY_WRITE_BUFFER作为复制

glEnable(GL_PROGRAM_POINT_SIZE);在顶点着色器中开启修改点的大小
并且在着色器中调用gl_PointSize = xxx;设置点的大小

gl_VertexID储存了正在绘制顶点的当前ID
使用glDrawElements进行索引渲染时,这个变量会存储正在绘制顶点的当前索引。使用glDrawArrays不用索引进行绘制的时候,这个变量会储存从渲染调用开始的已处理顶点数量。

hwnd=GetActiveWindow();获取当前窗口的句柄

片段着色器中 gl_FrontFacing变量是一个bool,如果当前片段是正向面的一部分那么就是true,否则就是false
gl_FragCoord的x和y分量是片段的窗口空间坐标 z是深度值
gl_FragCoord能让我们读取当前片段的窗口空间坐标
gl_FragDepth的输出变量,我们可以使用它来在着色器内设置片段的深度值 但是如果直接使用OpenGL就会禁用深度测试 因为他无法在片段着色器运行之前得知片段将拥有的深度值,因为片段着色器可能会完全修改这个深度值。()办法在下面
如果着色器没有写入值到gl_FragDepth,它会自动取用gl_FragCoord.z的值
方法 :在片段着色器顶部声明:layout (depth_) out float gl_FragDepth;
例子layout (depth_greater) out float gl_FragDepth;
condition 的值
any 默认值。提前深度测试是禁用的,你会损失很多性能
greater 你只能让深度值比gl_FragCoord.z更大
less 你只能让深度值比gl_FragCoord.z更小
unchanged 如果你要写入gl_FragDepth,你将只能写入gl_FragCoord.z的值

gl_FragCoord的z分量等于对应片段的深度值 x和y分量是片段的窗口空间坐标,其原点为窗口的左下角

uniform块
layout (std140) uniform Matrices
{
mat4 projection;
mat4 view;
};
创建了一个叫Matrices的uniform块 Uniform块中的变量可以直接访问,不需要加块名作为前缀
std140是设定std140布局 std140布局声明了每个变量的偏移量都是由一系列规则所决定 目前的理解是他是一个规范好了的布局 也就是你的里面的参数都是按一定的规定设定的

glUniformBlockBinding(shaderA.ID, lights_index, 2);将Uniform块绑定到一个特定的绑定点
第一个参数是一个程序对象
第二个参数是Uniform块索引和链接到的绑定点 Uniform块索引(Uniform Block Index)是着色器中已定义Uniform块的位置值索引。这可以通过调用glGetUniformBlockIndex来获取
第三个参数是将下面函数里面那个Lights的uniform链接到绑定点2

unsigned int lights_index = glGetUniformBlockIndex(shaderA.ID, “Lights”); 获取着色器中已定义Uniform块的位置值索引
第一个参数是程序对象
第二个参数是uniform块的名字

glBindBufferBase(GL_UNIFORM_BUFFER, 2, uboExampleBlock); 绑定Uniform缓冲对象到相同的绑定点上
第二个参数绑定点索引
第三个参数Uniform缓冲对象
// 或
glBindBufferRange(GL_UNIFORM_BUFFER, 2, uboExampleBlock, 0, 152);绑定Uniform缓冲对象到相同的绑定点上(可以让多个不同的Uniform块绑定到同一个Uniform缓冲对象上)
第二个参数是绑定点索引
第三个参数是Uniform对象
第四个参数是附加的偏移量
第五个参数是大小(不知道是啥)

所以用uniform的步骤
1.在着色器中创建uniform块
layout (std140) uniform Matrices
{
mat4 projection;
mat4 view;
};

2.在程序中:
unsigned int uniformBlockIndexRed = glGetUniformBlockIndex(shaderRed.ID, “Matrices”);//获取着色器中已定义Uniform块的位置值索引
glUniformBlockBinding(shaderRed.ID, uniformBlockIndexRed, 0);//将Uniform块绑定到一个特定的绑定点0
unsigned int uboMatrices
glGenBuffers(1, &uboMatrices);//创建Uniform块缓冲对象
下·
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices); //将uniform块缓冲对象绑定给GL_UNIFORM_BUFFER
glBufferData(GL_UNIFORM_BUFFER, 2 * sizeof(glm::mat4), NULL, GL_STATIC_DRAW);//因为第三个参数填NULL所以这里只是分配一下内存 两个mat4大小的内存
glBindBuffer(GL_UNIFORM_BUFFER, 0);//将缓冲中的特定范围(在这里是整个缓冲)链接到绑定点0

glBindBufferRange(GL_UNIFORM_BUFFER, 0, uboMatrices, 0, 2 * sizeof(glm::mat4));//绑定Uniform缓冲对象到相同的绑定点0上

glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);
glBindBuffer(GL_UNIFORM_BUFFER, uboMatrices);//绑定对象
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::mat4), glm::value_ptr(projection));//把projection中的数据传递给缓冲对象了
glBindBuffer(GL_UNIFORM_BUFFER, 0);//解绑

你可能感兴趣的:(opengl)