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

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

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

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

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

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

FragColor = Color*texture2D(u_texture, TextureCoordinates)

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


person Lyrk    schedule 20.01.2019    source источник
comment
Если вы не хотите переключать шейдеры, создайте текстуру 1x1 одного (белого) цвета и используйте ее для однородных цветных кубов. Привязать текстуру гораздо дешевле, чем менять программу.   -  person Rabbid76    schedule 20.01.2019
comment
спасибо ... Если вы ответите, я могу отметить это как ответ. Я думаю, что переключение шейдеров проще для меня.   -  person Applik    schedule 21.01.2019


Ответы (1)


Создайте текстуру 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); 
person Rabbid76    schedule 21.01.2019