2011-03-06 54 views
1

我正在讀「Ogre3D 1.7入門指南」一書。我編寫了一個cg片段着色器,但遇到編譯器抱怨,「函數'floor'不支持此配置文件「。Ogre3D cg片段着色器中的「功能」地板「不支持此功能」的解決方案

片段着色器的定義是在這裏:

fragment_program MyFragmentShader8 cg 
{ 
    source Ogre3DBeginnersGuideShaders.cg 
    entry_point MyFragmentShader8 
    profiles ps_1_1 arbfp1 
} 

的實施是在這裏:

void MyFragmentShader8(float2 uv :TEXCOORD0, 
    out float4 color :COLOR, 
    uniform sampler2D texture) 
{ 
    float num = 50; 
    float stepsize = 1.0/num; 
    float2 fragment = float2(stepsize * floor(uv.x * num), stepsize * floor(uv.y * num)); 
    color = tex2D(texture, fragment); 
} 

回答

1

您可以替換該行:

float2 fragment = float2(stepsize * floor(uv.x * num), stepsize * floor(uv.y * num)); 

與這3行:

int tmp1 = uv.x * num; 
int tmp2 = uv.y * num; 
float2 fragment = float2(stepsize * tmp1, stepsize * tmp2); 

轉換爲int是一個隱含的floor()。

+0

感謝您的回答,我試過了,但是這次編譯器報告了一個更奇怪的錯誤! – Liu 2011-03-06 10:13:05

+0

請告訴我們錯誤,我們可以解決它:-) – 2011-03-06 10:14:29

+0

這次它報告「(48):致命錯誤C9999:從屬紋理操作不符合紋理着色器的限制」。但是第(48)行離着色器實現很遠。 – Liu 2011-03-06 10:19:32

0

你標記你的問題的OpenGL,但您使用的配置文件的DirectX:

profiles ps_1_1 ... 

你可能着色器定義修改爲

profiles fp40 fp30 arbfp1 

,看看你的原始功能的工作原理。 配置文件記錄在nvidia cg編譯器附帶的用戶手冊pdf中。

0

在材料,你在書中設置

profiles ps_1_1 ... 

喜歡,但ps_1_1是DirectX8的具有功能

您應該使用

profiles ps_2_0 ... 

所以,你會使用directX9