【问题标题】:WebGL - How to pass unsigned byte vertex attribute colour values?WebGL - 如何传递无符号字节顶点属性颜色值?
【发布时间】:2011-08-26 08:17:06
【问题描述】:

我的顶点由具有这种结构的数组组成:

[     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);
} 

【问题讨论】:

  • 除了您的问题,您是否考虑过将属性作为 3 元素向量传递?这样可以节省代码和时间。
  • @Nobody 这就是我最初所做的。我只是切换到单独传递它们只是为了确保数组不是问题。

标签: opengl-es glsl webgl


【解决方案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);

哦,属性是不是材料。你不应该这样称呼他们。

【讨论】:

  • 谢谢。我误解了步幅是一组数据与下一组数据之间的差距。我之前尝试过标准化颜色,但我缺少的是 UNSIGNED_BYTE 类型。材质是一个包含着色器、它的属性和一些材质设置的对象,所以我认为将它称为材质是正确的。现在可以使用了。
【解决方案2】:
GLfloat red=(GLfloat)red/255;

我希望这就是你要找的 ^^

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 2018-10-27
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多