Трябва ли да напиша логика във фрагментен шейдър в този случай?

Имам 3 обекта:

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

Искам да нарисувам:

  • куб1 като червен(1,0,0),
  • куб2 с текстура1
  • cube3 с texture2.

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

FragColor = Color*texture2D(u_texture, TextureCoordinates)

както обикновено, но този код също рисува моя първи куб с цветовете на текстурата, които искам да бъдат само червени. Така че цветът е смесен. Въпросът ми е трябва ли да напиша логика във фрагментния шейдър, за да разделя тези случаи?


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