opengl-es - WebGL - 如何传递无符号字节顶点属性颜色值?

标签 opengl-es glsl webgl

我的顶点由具有以下结构的数组组成:

[     Position      ][        colour        ]
[float][float][float][byte][byte][byte][byte]

通过顶点位置是没有问题的:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aVertexPosition, 3, gl.FLOAT, false, 4, 0);

但我不知道如何将颜色传递给着色器。不幸的是,不能在 glsl 着色器中使用整数,所以我必须使用浮点数。
如何将我的无符号字节颜色值转换为 glsl 浮点颜色值?我分别对 r、g 和 b 进行了这样的尝试,但颜色都搞砸了:
gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aR, 1, gl.BYTE, false, 15, 12);

顶点着色器(coloredPoint.vs)
precision highp float;

attribute vec3 aVertexPosition;
attribute float aR;
attribute float aG;
attribute float aB;

uniform mat4 world;
uniform mat4 view;
uniform mat4 proj;

varying vec3 vVertexColour;

void main(void){
    gl_PointSize = 4.0;  
    gl_Position = proj * view * world * vec4(aVertexPosition, 1.0);
    vVertexColour = vec3(aR, aG, aB);
} 

像素着色器 (coloredPoint.fs)
precision highp float;

varying vec3 vVertexColour;

void main(void){
    gl_FragColor = vec4(vVertexColour, 1);
} 

最佳答案

gl.vertexAttribPointer(this.material.aVertexPosition, 3, gl.FLOAT, false, 4, 0);
gl.vertexAttribPointer(this.material.aR, 1, gl.BYTE, false, 15, 12);

你的步幅应该是 16,而不是 15,当然也不是 4。

此外,每个单独的颜色不需要是单独的属性。这四个字节可以是 vec4 输入。哦,你的颜色应该是标准化的无符号字节。也就是说,当着色器获取它们时,范围 [0, 255] 上的值应该缩放到 [0, 1]。因此,您想要的是:
gl.vertexAttribPointer(this.material.aVertexPosition, 3, gl.FLOAT, false, 16, 0);
gl.vertexAttribPointer(this.material.color, 4, gl.UNSIGNED_BYTE, true, 16, 12);

哦,属性不是 Material 。你不应该那样称呼他们。

关于opengl-es - WebGL - 如何传递无符号字节顶点属性颜色值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201826/

相关文章:

c++ - Qmatrix4x4 翻译不生效

glsl - 在 OpenGL ES 2.0/GLSL 中,哪里需要精度说明符?

c++ - 从 OpenGL 中的着色器读取多个纹理单元的问题

javascript - 在网络 worker 中解码图像

iOS:在初始化期间获取 View 大小

objective-c - 在 UIImageView 之上绘制使图像透明

android - glReadPixels 使用太慢

ios - 在 OpenGL ES 2.0 GLSL 中转置 mat4

javascript - 如何在 Threejs 中使用外部和内部网格对象渲染带有剪裁平面和模板的帽子

javascript - Collada 到 JSON