2016-06-01 5 views
0

Я хочу написать одну вершинный шейдер для работы с цветами и текстурами я использовал этот кодOpenGL ES2 цвета и текстуры шейдера

precision mediump float; 
varying vec4 v_Color; 
uniform sampler2D u_TextureUnit; 
varying vec2 v_TextureCoordinates; 

void main() { 
    gl_FragColor= (v_Color*texture2D(u_TextureUnit, v_TextureCoordinates)); 
} 

это работает, когда модель имеет текстурную карту, но если модель имеет только цвет его груз черный, я хочу проверить sampler2D u_TextureUnit перед тем, как положить gl_FragColor

ответ

4

Вы написали шейдер, который читается из блока текстуры; вы, как правило, избегаете условий в шейдерах, так как они потенциально разделяют путь выполнения. Обычно компилятор может понять это, если вещь, на которую вы действуете условно, является единообразной, но вы можете заплатить за перекомпиляцию каждый раз, когда вы устанавливаете форму. ES-не имеют средств интроспекции текущих свойств единицы выборки таким образом, на первый взгляд решения может быть что-то вроде:

uniform bool u_ApplyTexture; 
... 
if(u_ApplyTexture) 
    gl_FragColor = {what you already have}; 
else 
    gl_FragColor = v_Color; 

Не-условная альтернатива, возможно, к профилю в качестве альтернативы может быть:

uniform float u_TextureWeight; 
... 
gl_FragColor = v_Color* 
        mix(vec4(1.0), 
         texture2D(u_TextureUnit, v_TextureCoordinates), 
         u_TextureWeight); 

Как это будет оцениваться до v_Color*vec4(1.0), когда u_TextureWeight является 0.0 и v_Color*texture2D(u_TextureUnit, v_TextureCoordinates), когда u_TextureWeight является 1.0.

Если вы действительно хотите быть Hacky, вы можете просто загрузить свои текстуры, как негативные образы и отрицательные их снова в шейдере:

gl_FragColor = v_Color*(vec4(1.0) - texture2D(u_TextureUnit, v_TextureCoordinates)); 

Как и тогда, очевидно, если вы получаете vec4(0.0) от единицы выборки потому что никакая текстура не прикреплена, которая заканчивается умножением v_Color на 1.0.

+1

Я бы придерживался первого не-хакерского решения :) Или используйте два разных шейдера ... – 246tNt

+0

Действительно. Самая простая вещь сначала, всегда. Добавьте сложность только в той степени, в которой производительность диктует ее необходимость. – Tommy

+0

Идеальный ответ, спасибо – Mohamed

Смежные вопросы