1

我正在阅读《Ogre3D 1.7 初学者指南》一书。我编写了一个 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);
}
4

3 回答 3

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()。

于 2011-03-06T09:58:41.897 回答
0

您标记了您的问题 opengl,但您使用的是 directx 的配置文件:

profiles ps_1_1 ...

您可以将着色器定义更改为

profiles fp40 fp30 arbfp1

并查看您的原始功能是否有效。这些配置文件记录在 nvidia cg 编译器附带的用户手册 pdf 中。

于 2012-03-06T01:36:12.347 回答
0

在您设置的材料中

profiles ps_1_1 ...

就像书中的一样,但是 ps_1_1 是具有功能湖的 directX8

你应该使用

profiles ps_2_0 ...

因此,您将使用 directX9

于 2013-11-15T15:06:00.887 回答