我使用GC
在Unity3D
內部編寫着色器。CG:指定一個不能在頂點和片段着色器之間插入的變量
我使用頂點顏色屬性將一些參數傳遞給着色器。它們不會用於定義顏色,並且應該從頂點着色器轉發到像素着色器而不用修改它們。
這是我作爲輸入從Unity3D頂點着色器的結構:
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
fixed4 color : COLOR;
#if defined(SHADER_API_XBOX360)
half4 texcoord2 : TEXCOORD2;
half4 texcoord3 : TEXCOORD3;
half4 texcoord4 : TEXCOORD4;
half4 texcoord5 : TEXCOORD5;
#endif
};
這是頂點着色器輸入到片段返回的結構:
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
fixed4 col: COLOR;
};
如果我只是將參數轉發給片段着色器,當然它將被插入:
v2f vert (appdata_full v)
{
v2f output;
//....
output.col = v.color;
}
我想通過v.color
參數不插入片段着色器。 這是可能的嗎?如果是的話如何?
編輯
像蒂姆指出,這是預期的行爲,因爲着色器不能做任何事情比如果這些從頂點着色器傳遞出片段色彩插值別的。 我會盡力解釋我想達到的目標。我使用每個頂點顏色來存儲除顏色之外的其他類型的信息。沒有告訴所有細節,我在做什麼,讓我們說,你可以考慮每個顏色頂點作爲一個id(同一個三角形的每個頂點,將具有相同的顏色,實際上是相同的網格的每個頂點)。
所以我使用顏色技巧來掩蓋一些參數,因爲我沒有其他方法來做到這一點。現在這條信息必須以某種方式在片段着色器中可用。 如果通過作爲頂點着色器的輸出參數,則編碼爲顏色的該信息將在該片段處插入,不能再使用它。
我正在尋找一種傳播這些信息的方式,直到片段着色器(也許可以使用全局變量或類似的東西?如果是的話)。
你將如何協調每個像素的三個輸入(頂點),如果你不插值你能指望什麼發生,如果三角形的每個頂點具有不同的值 – Tim
@Tim? :好吧,你說得對,我明白你的反對意見。重點是,我的着色器中實際上顏色不是顏色。我使用顏色值來存儲其他類型的信息。我需要將每個頂點信息從頂點轉發到片段着色器,最終不會將其作爲頂點着色器的參數傳遞,而是使用某些「全局變量」(如果可能的話)。我希望清楚。 – Heisenbug
如果它是一種顏色或索引或其他東西,這並不重要。可以說你正在畫一個三角形。基於一些任意的每頂點計算;頂點0輸出「5」,頂點1輸出「10」,頂點2輸出「15」。您要在片段着色器中顯示這三個數字中的哪一個?如果它的確是一種全球價值而不是使用制服,但是否則我認爲你並沒有完全想到這一點。除非你只是說「我總是希望頂點0的值而忽略其他兩個」,這沒有多大意義。 – Tim