2014-02-06 3 views
0

У меня есть вершинный шейдер, используемый несколькими пиксельными шейдерами - GLSL ES 2.0 на iOS. VS выводит преобразованное положение, нормальный и один набор двумерных uv-коордов. Вот голые кости из него:GLSL ES Pixel Shader работает только в том случае, если неиспользованные текс-символы передаются в

void main() { 
    vec4 xlt_outPos; 
    vec3 xlt_outNormal; 
    vec2 xlt_uv0; 
    xray_bone_vp(vec4(vertex), vec3(normal), vec2(uv), xlt_outPos, xlt_outNormal, xlt_uv0); 
    gl_Position = vec4(xlt_outPos); 
    xlv_TEXCOORD6 = vec3(xlt_outNormal); 
    xlv_TEXCOORD0 = vec2(xlt_uv0); 
} 

Это основан на шейдере Cg, который выводит иу в TEXCOORD0 и использует TEXCOORD6 для нормального.

Моя проблема заключается в том, что PS, которые принимают уф Coords и нормально, так как входы работают отлично, но те, которые принимают нормальный только нет. Если я изменю сигнатуру метода PS, которая будет передана uv, но не используйте ее, она работает!

Является ли это ожидаемым, четко определенным поведением? Если да, существует ли способ избежать передачи нежелательных параметров шейдерам или создания нескольких версий VS?

+0

Не могли бы вы поделиться код вывода структуры ВС и соответствующий вход PS как в рабочем и сломанных шейдеры? В целом эти структуры должны быть равны. – brigadir

+0

У меня есть это, но не я могу добраться до него прямо сейчас. Однако я думаю: «В целом эти структуры должны быть равны» - это ответ, который я ищу ... если вы можете написать это как ответ с любыми ссылками, репутация ваша :) –

+0

Хорошо. В любом случае, было бы полезно посмотреть на объявление структуры вершины в пиксель-шейдер. – brigadir

ответ

1

Я могу предположить, что структура вывода VS и вход PS различны. Правильный код должен быть такой:

// declare vertex-to-pixel data structure: 
struct v_Output { 
    float4 position : POSITION; 
    float2 texCoord0 : TEXCOORD0; 
    float2 texCoord1 : TEXCOORD1; 
}; 

v_Output vertex_shader(...) { 
    ... 
    return (v_Output)output_data; 
} 

void pixel_shader(float2 texCoord0 : TEXCOORD0, 
        float2 texCoord1 : TEXCOORD1, 
        out float4 color : COLOR { 
    color = ...; 
} 

И есть некоторые правила:

  • вы не можете требовать в поле пиксельных шейдеров, что вершинные шейдеры не производят
  • TEXCOORD# должны быть в не прерывая заказ (`TEXCOORD0, TEXCOORD1 ...)

Больше всего вы должны изменить TEXCOORD6 к TEXCOORD1. В любом случае, без вашего кода сложно предложить что-либо. И было бы неплохо получить точную ошибку компиляции при настройке ваших шейдеров.

Кроме того, посмотрите на эту ссылку, чтобы узнать больше о Cg языке затенения: http://http.developer.nvidia.com/CgTutorial/cg_tutorial_chapter03.html