GLSL 2.0 цвет и текстура - PullRequest
       13

GLSL 2.0 цвет и текстура

3 голосов
/ 27 февраля 2012

Привет, я новичок в GLSL и у меня возникло несколько проблем.

Я пытаюсь создать пару шейдеров GLSL для использования цвета или текстуры, но я, должно быть, делаю что-то не так.Проблема в том, что если установить для uUseTexture значение 0 (которое должно указывать цвет), оно не будет работать (объект не окрашен).Я знаю, что код раскраски работает отдельно, какие-либо подсказки, почему он не работает с помощью оператора if?

Вот код:

// Фрагмент

precision mediump float;

uniform int uUseTexture;
uniform sampler2D uSampler;

varying vec4 vColor;
varying vec2 vTextureCoord;

void main(void) {

    if(uUseTexture == 1) {
        gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
    } else {
        gl_FragColor = vColor;
    }

}

// Vertex

attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
attribute vec2 aTextureCoord;

uniform int uUseTexture;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;

varying vec4 vColor;
varying vec2 vTextureCoord;

void main(void) {
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);

    if(uUseTexture == 1) {
        vTextureCoord = aTextureCoord;
    } else {
        vColor = aVertexColor;
    }

1 Ответ

5 голосов
/ 27 февраля 2012

Ничто не приходит на ум, сразу же взглянув на ваш код, но я хотел бы воспользоваться моментом и указать, что этот вариант использования может быть рассмотрен без использования оператора if. Например, давайте обработаем uUseTexture как число с плавающей точкой вместо целого (вы могли бы привести его в шейдер, но это более интересно):

// Vertex

attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
attribute vec2 aTextureCoord;

uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;

varying vec4 vColor;
varying vec2 vTextureCoord;

void main(void) {
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
    // It may actually be faster to just assign both of these anyway
    vTextureCoord = aTextureCoord;
    vColor = aVertexColor;
}

// Фрагмент

uniform float uUseTexture;
uniform sampler2D uSampler;

varying vec4 vColor;
varying vec2 vTextureCoord;

void main(void) {
    // vTextureCoord is already a vec2, BTW
    vec4 texColor = texture2D(uSampler, vTextureCoord) * uUseTexture;
    vec4 vertColor = vColor * (1.0 - uUseTexture); 
    gl_FragColor = texColor + vertColor;
}

Теперь uUseTexture просто действует как модулятор для того, сколько из каждого источника цвета вы хотите использовать. И это более гибко, так как вы можете установить его на 0,5 и получить также половину текстуры / половину вершины!

Что вас может удивить, так это то, что есть большая вероятность того, что именно так шейдер-компилятор и делает за кадром, когда вы используете оператор if, подобный этому. Обычно это более эффективно для аппаратного обеспечения.

...