Должен ли я написать логику во фрагментном шейдере в этом случае? - PullRequest
0 голосов
/ 20 января 2019

У меня есть 3 объекта:

  • куб1
  • куб2
  • куб3

Я хочу нарисовать:

  • куб1 как красный (1,0,0) ,
  • cube2 с texture1
  • cube3 с texture2 .

В фрагментном шейдере я использовал

FragColor = Color*texture2D(u_texture, TextureCoordinates)

как обычно, но этот код также окрашивает мой 1-й куб в цвета текстуры, которые я хочу, чтобы он был только красным. Так что цвет перепутал. Мой вопрос должен ли я написать логику во фрагментном шейдере для разделения этих случаев?

1 Ответ

0 голосов
/ 21 января 2019

Создайте текстуру 1x1 с одним (белым) цветом и используйте ее для однородных цветных кубов. Связывание и использование этой текстуры намного «дешевле», чем изменение программы шейдера:

let whiteTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, whiteTexture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
              new Uint8Array([255,255,255,255]));
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);

Обратите внимание, что поиск этой текстуры (texture2D(u_texture, TextureCoordinates)) всегда будет возвращать vec4(1.0).

Если текстура связана (с единицей текстуры, которая назначена для u_texture), тогда

FragColor = Color * texture2D(u_texture, TextureCoordinates);

устанавливает тот же цвет фрагмента, что и

FragColor = Color * vec4(1.0); 
...