WebGL - Как передать значения цвета атрибута байта без знака? - PullRequest
17 голосов
/ 26 августа 2011

Мои вершины состоят из массива с такой структурой:

[     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, поэтому я должен использовать float.Как я могу получить свое значение беззнакового байта в значение цвета с плавающей точкой glsl?Я пытался сделать это для r, g и b отдельно, но все цвета перепутаны:

gl.bindBuffer(gl.ARRAY_BUFFER, this.vbo);
gl.vertexAttribPointer(this.material.aR, 1, gl.BYTE, false, 15, 12);

Vertex Shader (colouredPoint.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);
} 

Pixel Shader (colouredPoint.фс)

precision highp float;

varying vec3 vVertexColour;

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

Ответы [ 2 ]

27 голосов
/ 26 августа 2011
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);

О, а атрибуты не материалы. Вы не должны называть их так.

1 голос
/ 26 августа 2011
GLfloat red=(GLfloat)red/255;

Надеюсь, это то, что вы ищете ^^

...