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

建设网站的服务器费用建筑工程网络计划技术

建设网站的服务器费用,建筑工程网络计划技术,一流的上海网站建设,wordpress彩色tagQTOpenGL高级数据和高级GLSL 本篇完整工程见gitee:QtOpenGL 对应点的tag#xff0c;由turbolove提供技术支持#xff0c;您可以关注博主或者私信博主 高级数据 OpenGL中的缓冲区 对象管理特定的GPU内存 在将缓冲区绑定到特定的缓冲区目标时候赋予它意义 OpenGL在内部会保…QTOpenGL高级数据和高级GLSL 本篇完整工程见gitee:QtOpenGL 对应点的tag由turbolove提供技术支持您可以关注博主或者私信博主 高级数据 OpenGL中的缓冲区 对象管理特定的GPU内存 在将缓冲区绑定到特定的缓冲区目标时候赋予它意义 OpenGL在内部会保存每个目标缓冲区的引用并且根据目标以不同的方式处理缓冲区。 glBufferData 填充缓冲对象所管理的内存 glBufferSubData 填充缓冲的特定区域 glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(data), data);将数据导入缓冲区的另外一种方法 通过调用glMapBuffer函数OpenGL会返回当前绑定的缓冲区的内存指针直接将数据复制到缓冲中 glMapBuffer使用的时候缓冲区的内存必须已经存在 float data[] {0.5f, 1.0f, -0.35f... }; glBindBuffer(GL_ARRAY_BUFFER, buffer); // 获取指针 void *ptr glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY); // 复制数据到内存 memcpy(ptr, data, sizeof(data)); // 记得告诉OpenGL我们不再需要这个指针了 glUnmapBuffer(GL_ARRAY_BUFFER);分批顶点属性 float positions[] { ... }; float normals[] { ... }; float tex[] { ... }; // 填充缓冲 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(positions), positions); glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions), sizeof(normals), normals); glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions) sizeof(normals), sizeof(tex), tex);使用glVertexAttribPointer指定顶点数组缓冲区内筒的属性布局。 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)(sizeof(positions))); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)(sizeof(positions) sizeof(normals)));复制缓冲 当你的缓冲已经填充好数据之后你可能会想与其它的缓冲共享其中的数据或者想要将缓冲的内容复制到另一个缓冲当中。glCopyBufferSubData能够让我们相对容易地从一个缓冲中复制数据到另一个缓冲中。这个函数的原型如下 void glCopyBufferSubData(GLenum readtarget, GLenum writetarget, GLintptr readoffset,GLintptr writeoffset, GLsizeiptr size);readtarget和writetarget参数需要填入复制源和复制目标的缓冲目标 如果想读写数据的两个不同缓冲都为顶点数组缓冲该怎么办使用下面的例子 float vertexData[] { ... }; glBindBuffer(GL_COPY_READ_BUFFER, vbo1); glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2); glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));float vertexData[] { ... }; glBindBuffer(GL_COPY_READ_BUFFER, vbo1); glBindBuffer(GL_COPY_WRITE_BUFFER, vbo2); glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, sizeof(vertexData));高级GLSL 顶点着色器变量 gl_Position : 输出变量顶点着色器的裁减空间位置向量gl_PointSize 输出变量是一个float变量设置点的宽高(像素) glEnable(GL_PROGRAM_POINT_SIZE); gl_VertexID 输入变量储存了正在绘制顶点的当前ID shader.vert #version 330 core layout (location 0) in vec3 aPos; layout (location 1) in vec3 aNormal; layout (location 2) in vec2 aTexCoords; out vec3 Normal; out vec3 FragPos; out vec2 TexCoords; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() {TexCoordsaTexCoords;Normal mat3(transpose(inverse(model))) * aNormal;FragPosvec3(model * vec4(aPos,1.0));gl_Position projection * view * model * vec4(aPos, 1.0);gl_PointSize gl_Position.z; }片段着色器变量 gl_FragCoord 的x和y分量是片段的窗口空间的坐标其原点为窗口的左下角z分量等于对应片段的深度值gl_FrontFacing 变量是一个bool如果当前片段是正面向的一部分那么就是true, 否则就是falsegl_FragDepth 着色器内设置片段的深度值 shader.frag void main() {if(gl_FragCoord.x 400 )FragColor vec4(1.0, 0.0, 0.0, 1.0);elseFragColor vec4(0.0, 1.0, 0.0, 1.0); }gl_FrontFacing 变量是一个bool如果当前片段是正面向的一部分那么就是true, 否则就是false #version 330 core out vec4 FragColor; in vec2 TexCoords; uniform sampler2D frontTexture; uniform sampler2D backTexture; void main() { if(gl_FrontFacing)FragColor texture(frontTexture, TexCoords);elseFragColor texture(backTexture, TexCoords); }gl_FragDepth 着色器内设置片段的深度值 #version 420 core // 注意GLSL的版本 out vec4 FragColor; layout (depth_greater) out float gl_FragDepth;void main() { FragColor vec4(1.0);gl_FragDepth gl_FragCoord.z 0.1; } layout (depth_condition) out float gl_FragDepth; condition可以为下面的值 条件描述any默认值。提前深度测试是禁用的你会损失很多性能greater你只能让深度值比gl_FragCoord.z更大less你只能让深度值比gl_FragCoord.z更小unchanged如果你要写入gl_FragDepth你将只能写入gl_FragCoord.z的值 接口块 接口块的声明和struct的声明有点相像不同的是现在根据它是一个输入还是输出块(Block)使用in或者out关键字来定义的。 shader.vert #version 330 core layout (location 0) in vec3 aPos; layout (location 1) in vec2 aTexCoords;uniform mat4 model; uniform mat4 view; uniform mat4 projection;out VS_OUT {vec2 TexCoords; } vs_out;void main() {gl_Position projection * view * model * vec4(aPos, 1.0); vs_out.TexCoords aTexCoords; } shader.frag #version 330 core out vec4 FragColor;in VS_OUT {vec2 TexCoords; } fs_in;uniform sampler2D texture;void main() { FragColor texture(texture, fs_in.TexCoords); }只要两个接口块的名字一样对应的输入和输出将会匹配起来。 块名应该是和着色器中一样的VS_OUT但是实例名称vs_out, fs_in是可以随意的。 Uniform缓冲对象 当使用多于一个的着色器时候尽管大部分的uniform变量都是相同的我们还是需要不断的设置它们。解决办法全局uniform变量。 shader.vert #version 330 core layout (location 0) in vec3 aPos; layout (std140) uniform Matrices {mat4 projection;mat4 view; }; uniform mat4 model; void main() {// uniform 块中的变量可以直接访问不需要加块名称作为前缀。gl_Position projection * view * model * vec4(aPos, 1.0); }其中 layout (std140) 设置了Uniform块布局 使用std140布局计算出每个成员的对齐偏移量 layout (std140) uniform ExampleBlock {// 基准对齐量 // 对齐偏移量float value; // 4 // 0 vec3 vector; // 16 // 16 (必须是16的倍数所以 4-16)mat4 matrix; // 16 // 32 (列 0)// 16 // 48 (列 1)// 16 // 64 (列 2)// 16 // 80 (列 3)float values[3]; // 16 // 96 (values[0])// 16 // 112 (values[1])// 16 // 128 (values[2])bool boolean; // 4 // 144int integer; // 4 // 148 }; 类型布局规则标量比如int和bool每个标量的基准对齐量为N。向量2N或者4N。这意味着vec3的基准对齐量为4N。标量或向量的数组每个元素的基准对齐量与vec4的相同。矩阵储存为列向量的数组每个向量的基准对齐量与vec4的相同。结构体等于所有元素根据规则计算后的大小但会填充到vec4大小的倍数。 我们已经讨论了如何在着色器中定义Uniform块并设定它们的内存布局了但我们还没有讨论该如何使用它们。 首先我们需要调用glGenBuffers创建一个Uniform缓冲对象。一旦我们有了一个缓冲对象我们需要将它绑定到GL_UNIFORM_BUFFER目标并调用glBufferData分配足够的内存。 unsigned int uboExampleBlock; glGenBuffers(1, uboExampleBlock); glBindBuffer(GL_UNIFORM_BUFFER, uboExampleBlock); glBufferData(GL_UNIFORM_BUFFER, 152, NULL, GL_STATIC_DRAW); // 分配152字节的内存 glBindBuffer(GL_UNIFORM_BUFFER, 0);UBO代码实现 具体实现请参照tag-UBO
http://www.w-s-a.com/news/880481/

相关文章:

  • 丽水市龙泉市网站建设公司江门手机模板建站
  • 做化妆品注册和注册的网站有哪些wordpress加关键字
  • 四川新站优化php笑话网站源码
  • 外贸类网站酷玛网站建设
  • 合肥网站设计建设南宁网站seo推广优化公司
  • 临沂百度网站7x7x7x7x8黄全场免费
  • 海洋牧场网站建设大良网站设计价格
  • 手机端网站关键字排名北京seo公司哪家好
  • 福建建设培训中心网站网站建站服务公司地址
  • 青岛网站优化快速排名企业网址怎么整
  • 做公司网站用什么系统seo搜索排名优化方法
  • dw怎么做网站标题图标做网站重庆
  • 机场建设相关网站公司官网设计制作
  • 大学网站建设的目标技术支持 优府网络太原网站建设
  • wordpress设置密码访问带提示广州做网站优化哪家专业
  • 如何帮人做网站赚钱西安室内设计公司排名
  • 房产网站建设产品网站域名和邮箱域名
  • 网站建设核心优势seo求职信息
  • 网站手册自己在百度上可以做网站吗
  • 影楼网站源码建行业网站的必要性
  • 深圳app网站设计软件开发公司税收优惠政策
  • 北京市中关村有哪家可以做网站维护客户管理系统 wordpress
  • 做网站拉客户有效吗全景图网页制作工具
  • 网站建设公司行业建设网站需要提供什么资料
  • 别人的做网站网页打不开图片
  • 北京专业网站设计推荐怎么建立网站网址
  • 上海网站建设开发公司哪家好网站数据搬家
  • 杭州建站平台哪里有免费的网站推广软件
  • 深圳极速网站建设服务什么网站可以做产品入驻
  • 淄博易宝网站建设app推广拉新公司