当前位置: 首页 > news >正文

天河门户网站建设公司遵义酷虎网站开发

天河门户网站建设公司,遵义酷虎网站开发,wordpress 注册机制,WordPress主题设置数据库OpenGL基础 - 统一变量Uniform 目录 一、说明二、 Uniform变量概念2.1 Uniform变量和特点2.2 Uniform变量定义方法2.3 Uniform变量赋值和传参 三、如何在Shader中自定义Location四、赋值五、统一变量缓冲对象六、赋值函数 一、说明 关于统一变量#xff0c;也有一系列概念和方…OpenGL基础 - 统一变量Uniform 目录 一、说明二、 Uniform变量概念2.1 Uniform变量和特点2.2 Uniform变量定义方法2.3 Uniform变量赋值和传参 三、如何在Shader中自定义Location四、赋值五、统一变量缓冲对象六、赋值函数 一、说明 关于统一变量也有一系列概念和方式如果不加以梳理迟早将陷入泥藻之中本篇将梳理全套的有关Uniform的描述汇集起来当作手册备用。 二、 Uniform变量概念 2.1 Uniform变量和特点 OpenGL基础: Uniform变量 即统一变量。简单理解就是一个GLSL shader中的全局常量特点是 可以随意在任意shader(vertex shader, geometry shader, or fragment shader)访问不同的shader中uniform是一起链接的。   初始化之后不能修改其值否则会引起编译错误。   是CPU一侧直接赋值给GPU的变量。 2.2 Uniform变量定义方法 1 定义以及使用Uniform变量的方法 在着色器内定义接受变量 vertex shader#version 400 layout(location 0) in vec3 position; layout(location 1) in vec3 color; out vec3 outColor; uniform mat4 wmat; void main() {Color color;gl_Position wmat * vec4(position, 1.f); }2.3 Uniform变量赋值和传参 1 ) 值传    使用Uniform的定义一个向量可以通过location设置Unfirom值外部CPU程序代码中写 glm::mat amat; // define a mat, and give it any value you need. ... GLuint loc glGetUniformLocation(program, wmat); if (loc 0) // if fail, loc -1 {glUniformMatrix4fv(loc, 1, GL_FALSE, amat[0][0]); }“wmat”是着色器的对应变量。glUniformMatrix4fv此为执行赋值函数。 2数组传递    如果是Uniform数组由vecx元素组成也可以直接这样获取location GLSL中定义 uniform vec3 Array[10];C客户端程序获取指针 GLuint loc glGetUniformLocation(program, Array[1]);3结构传递    如果是Uniform Struct也可以类似地直接获取 GLSL中定义 struct aStruct {vec3 lightPos;vec4 lightColor;mat4x3 otherMat; }myStruct;C客户端程序获取(注意前缀名字是myStruct不是aStruct) GLuint loc glGetUniformLocation(program, “myStruct.lightPos”) 这个名字变量的获取风格类C了对于C程序员十分友好。 其实就是定义在GLSL中的一个结构体Struct 例子 uniform MyBlock // 定义在shader中 {vec4 color1;vec4 color2;float r1;float r2; }myBlock;三、如何在Shader中自定义Location 就是在Shader中自定义一个uniform的location layout(location 2) uniform mat4 worldMat;这样在C客户端程序中就可以直接赋值无需要寻址了 glUniformMatrix4fv(2, 1, GL_FALSE, worldMat[0][0]); 不过这种自定义location需要十分小心如果赋予两个uniform同样的location那就会产生链接错误。 尤其是同时赋予多个uniform location的时候要注意 layout(location 2) uniform vec4 aVec[8];那么aVec的uniform location值范围是[2, 10) 所以如果这样定义 layout(location 2) uniform vec4 aVec[8]; layout(location 5) uniform mat4 aMat[2];那么就是非法的会引起链接错误。因为aVec占用了【2-10】aMat只能从11开始。 四、赋值 可以给uniform赋予默认值如果C客户端没有给uniform值得时候GLSL会预先给出默认值当客户端赋值时默认值被冲掉 uniform vec4 greenColor vec4(0.0, 1.0, 0.0, 1.0); uniform vec3 vers[4] vec3[](vec3(0.3, -0.8, 0.1),vec3(0.2, 1.0, 0.2),vec3(0.6, -1.0, 0.3),vec3(0.9, 0.7, 0.4));五、统一变量缓冲对象 这是高级用法统一变量缓冲对象 – Uniform buffer object    这个用法稍微有点难坑比较多的所以建议初学者可以暂时跳过因为一开始学OpenGL应该暂时不需要使用使用前面的方法操作Uniform应该就足够了。 这里先抛砖引玉简单举例应用一下一些小坑小知识点不详细展开会后续教程中补全的还会专门讲这个用法。当然看完下面这一段也足够可以使用这个知识点了。 这个是OpenGL客户端程序和GLSL中的Uniform变量对应的对象也可以是和变量块Uniform block, 变量数组Uniform array对应。 目的是为了方便在OpenGL客户端操作修改值GLSL的Uniform对象尤其是一组uniform值得时候更加方便修改。 例如在GLSL中定义 layout (std140 binding 0) uniform MATS {mat4 mvMat;vec3 aPos; };layout (std140, binding 1) uniform MAT_BLOCK {mat4 matPool[120]; }; 在C客户端程序中修改// 第一个binding 0 struct ABlock {glm::mat4 aMatrix;glm::vec3 pos; }; glGenBuffers(1, aMapBuffer); glBindBuffer(GL_UNIFORM_BUFFER, aMapBuffer); glBufferData(GL_UNIFORM_BUFFER, sizeof(ABlock), NULL, GL_DYNAMIC_DRAW);// Careful: The parameter 0: is correspondant to binding 0; not location. // 0 是对应 GLSL中的bingding 0; 不是location 0 glBindBufferBase(GL_UNIFORM_BUFFER, 0, aMapBuffer);ABlock* mapBlock (ABlock*)glMapBufferRange(GL_UNIFORM_BUFFER,0,sizeof(ABlock),GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);mapBlock-aMatrix glm::mat(1); // set any value you want here to GLSL mapBlock-pos glm::vec3(1); // set any value you want here to GLSL glUnmapBuffer(GL_UNIFORM_BUFFER);// 第二个(binding 1) struct MatPool {glm::mat4 viewMat;glm::mat4 worldMat;glm::mat4 modelMat };glGenBuffers(1, matBuffer); glBindBuffer(GL_UNIFORM_BUFFER, matBuffer); glBufferData(GL_UNIFORM_BUFFER, sizeof(MatPool), NULL, GL_DYNAMIC_DRAW);// Careful: The parameter 1: is correspondant to binding 1; not location. // 1 是对应 GLSL中的bingding 1; 不是location 1 glBindBufferBase(GL_UNIFORM_BUFFER, 1, uniforms_buffer); MatPool* mBlock (MatPool*)glMapBufferRange(GL_UNIFORM_BUFFER,0,sizeof(MatPool),GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); glm::mat4 modelMat glm::mat(1); glm::mat4 viewMat glm::mat(1); glm::mat4 worldMat glm::mat(1); mBlock-viewMat viewMat; mBlock-worldMat worldMat; mBlock-modelMat modelMat; glUnmapBuffer(GL_UNIFORM_BUFFER);第二个设置的时候可以看到C客户端的Struct结构和GLSL的结构体是不一样的C客户端是三个mat4的结构体GLSL是一个结构体数组我故意举这样的例子是为了说明只要数据对应就行了不一定要格式严格对应。 GLSL中利用binding设置索引位置可以使用多个Uniform block绑定到客户端使用当然也可以使用下面函数取得这个索引位置就可以不在GLSL中明显声明即可以省略binding 0;由GLSL自动分配索引位置。 GLuint glGetUniformBlockIndex( GLuint program, const char *uniformBlockName );还有其他各种用法其实就没有那么实用了这里就不贴出来可以根据需要的时候再进一步查阅。 六、赋值函数 可以使用glUniform*这个函数来设置不同值类型的uniformOpenGL的设计风格是使用不同类型的后缀变形函数来设置参考All kinds of set up uniform value examples GLAPI/glUniform - OpenGL Wiki ​www.khronos.org/opengl/wiki/GLAPI/glUniform    这里摘录一些摘录这些的原因是只要知道这些赋值方法那么其他类值得赋值方法也能推演出来 glUniform1i(loc, (int)value); // setup uniform one int value void glUniform2f(GLint location, GLfloat v0, GLfloat v1); void glUniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2);void glUniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void glUniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); void glUniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);更多的函数形式 函数参数1参数2参数3参数4参数5void glUniform1f( GLint location,GLfloat v0);void glUniform2f( GLint location,GLfloat v0,GLfloat v1);void glUniform3f( GLint location,GLfloat v0,GLfloat v1,GLfloat v2);void glUniform4f( GLint location,GLfloat v0,GLfloat v1,GLfloat v2,GLfloat v3);void glUniform1i( GLint location,GLint v0);void glUniform2i( GLint location,GLint v0,GLint v1);void glUniform3i( GLint location,GLint v0,GLint v1,GLint v2);void glUniform4i( GLint location,GLint v0,GLint v1,GLint v2,GLint v3);void glUniform1ui( GLint location,GLuint v0);void glUniform2ui( GLint location,GLuint v0,GLuint v1);void glUniform3ui( GLint location,GLuint v0,GLuint v1,GLuint v2);void glUniform4ui( GLint location,GLuint v0,GLuint v1,GLuint v2,GLuint v3);void glUniform1fv( GLint location,GLsizei count,const GLfloat *value);void glUniform2fv( GLint location,GLsizei count,const GLfloat *value);void glUniform3fv( GLint location,GLsizei count,const GLfloat *value);void glUniform4fv( GLint location,GLsizei count,const GLfloat *value);void glUniform1iv( GLint location,GLsizei count,const GLint *value);void glUniform2iv( GLint location,GLsizei count,const GLint *value);void glUniform3iv( GLint location,GLsizei count,const GLint *value);void glUniform4iv( GLint location,GLsizei count,const GLint *value);void glUniform1uiv( GLint location,GLsizei count,const GLuint *value);void glUniform2uiv( GLint location,GLsizei count,const GLuint *value);void glUniform3uiv( GLint location,GLsizei count,const GLuint *value);void glUniform4uiv( GLint location,GLsizei count,const GLuint *value);void glUniformMatrix2fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix3fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix4fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix2x3fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix3x2fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix2x4fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix4x2fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix3x4fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value);void glUniformMatrix4x3fv( GLint location,GLsizei count,GLboolean transpose,const GLfloat *value); 参考
http://www.pierceye.com/news/18549/

相关文章:

  • 谷歌seo网站怎么做产品分类做网站关键字
  • 江苏省建设工程竣工备案网站wordpress快报插件
  • 石家庄网站开发公司武昌网站建设
  • 企业网站建设 会计分录英铭长沙网站建设
  • 常宁市城市建设规划管理局网站商业网站建设公司推荐
  • 建站平台营销做网站常熟
  • 青岛网站备案知识付费网站建设
  • 做网站如何下载别人网站图片做美食的视频网站
  • 昌平网站建设哪家强小程序二次开发多少钱
  • 先进的网站建设网络营销的推广方式
  • 做网站的广告做一个网站成本是多少
  • 公司网站开发建设什么会计科目现在做网站都是怎么做的
  • 旅游网站建设步骤工信部域名备案信息查询
  • 中国建设银行官网的网站首页网站建设公司咨
  • 一个ip 做2个网站品牌建设成效有待提升
  • 自动生成手机网站北京网站优化wyhseo
  • linux服务器怎么做网站化妆品网站的建设 论文
  • 医院建设网站的作用免费软件开发app
  • 外贸网站设计模板惠阳建设局网站
  • 服务类网站模板大连海洋大学工程建设信息网
  • 小说发表哪个网站赚钱网站建设新方向
  • 承德网站建设怎么做滁州百度seo
  • 建设网站一定要数据库吗app小程序开发价格
  • 做公益网站wordpress 如何修改导航链接
  • 如何微信做演讲视频网站wordpress不显示引用图片不显示
  • 网站建设的步骤教程视频室内设计学校大专
  • 免费域名申请网站大全下载会员网站建设
  • 券多多是谁做的网站微信链接网站怎么做
  • 做网站 空间wordpress 判断
  • 有什么类似凡科建站台州自助建站在线咨询