1

我想知道 GLSL 和 HLSL 数学之间是否有区别。我正在使用一个自制的引擎,它可以很好地与 openTK 一起使用。我的 SharpDx 实现每天都更进一步。我目前正在研究 ModelviewProjection 矩阵。为了查看它是否有效,我使用了一个可以很好地与 OpenTK 配合使用的简单项目。所以我将 Shader 代码从 GLSL 更改为 HLSL,因为程序的其余部分使用引擎功能。该程序不起作用我看不到几何,所以我将模型视图矩阵和投影矩阵更改为身份矩阵。后来它起作用了,我看到了几何形状。所以我更改了一些 GLSL,因为我想要一个与 HLSL 类似的 GLSL 代码,并且我也将 Matrixes 更改为 identy。之后我没有看到任何不起作用的东西......所以我被卡住了...... 你们有任何想法吗?无论如何,长话短说我的 HLSL 着色器代码

public string Vs = @"cbuffer Variables : register(b0){
float4 Testfarbe;
float4x4 FUSEE_MVP;
} 
struct VS_IN
{
    float4 pos : POSITION;
    float4 tex : TEXCOORD;
    float4 normal : NORMAL;
};
struct PS_IN
{
    float4 pos : SV_POSITION;
    float4 col : COLOR;
    float4 tex : TEXCOORD;
    float4 normal : NORMAL;
};
PS_IN VS( VS_IN input )
{
    PS_IN output = (PS_IN)0;
    input.pos.w = 1.0f;
    output.pos = mul(input.pos,FUSEE_MVP);
    output.col = Testfarbe;
    /*output.col = FUSEE_MV._m00_m01_m02_m03;*/
/*    output.normal = input.normal;
    output.tex = input.tex;*/
 /*   if (FUSEE_MV._m00 == 4.0f)
        output.col = float4(1,0,0,1);
    else
        output.col = float4(0,0,1,1);*/

    return output;
}
";
string Ps = @"
SamplerState pictureSampler;
Texture2D imageFG;
struct PS_IN
{
    float4 pos : SV_POSITION;
    float4 col : COLOR;
    float4 tex : TEXCOORD;
    float4 normal : NORMAL;
};

float4 PS( PS_IN input ) : SV_Target
{
    return input.col;
    /*return  imageFG.Sample(pictureSampler,input.tex);*/
    }";

所以我改变了我以前工作的 OpenTk 项目,看看 openTK 和 SharpDx 之间在数学计算方面的区别在哪里。

HLSL 代码

 public string Vs = @"
            /* Copies incoming vertex color without change.
             * Applies the transformation matrix to vertex position.
             */

            attribute vec4 fuColor;
            attribute vec3 fuVertex;
            attribute vec3 fuNormal;
            attribute vec2 fuUV;

            varying vec4 vColor;
            varying vec3 vNormal;
            varying vec2 vUV;

            uniform mat4 FUSEE_MVP;
            uniform mat4 FUSEE_ITMV;

            void main()
            {
                gl_Position = FUSEE_MVP * vec4(fuVertex, 1.0);
                /*vNormal = mat3(FUSEE_ITMV[0].xyz, FUSEE_ITMV[1].xyz, FUSEE_ITMV[2].xyz) * fuNormal;*/
                vUV = fuUV;
            }";

        public string Ps = @"
            /* Copies incoming fragment color without change. */
            #ifdef GL_ES
                precision highp float;
            #endif

            uniform vec4 vColor;
            varying vec3 vNormal;

            void main()
            {
                gl_FragColor = vColor * dot(vNormal, vec3(0, 0, 1));
            }";

在主代码本身中,我只读取了一个 Obj 文件并设置了标识矩阵

    public override void Init()
        {
        Mesh = MeshReader.LoadMesh(@"Assets/Teapot.obj.model");



        //ShaderProgram sp = RC.CreateShader(Vs, Ps);
        sp = RC.CreateShader(Vs, Ps);
        _vTextureParam = sp.GetShaderParam("Testfarbe");//vColor
}
    public override void RenderAFrame()
        {

... var mtxRot = float4x4.CreateRotationY(_angleHorz) * float4x4.CreateRotationX(_angleVert); var mtxCam = float4x4.LookAt(0, 200, 500, 0, 0, 0, 0, 1, 0);

        // first mesh
        RC.ModelView = float4x4.CreateTranslation(0, -50, 0) * mtxRot * float4x4.CreateTranslation(-150, 0, 0) * mtxCam;

        RC.SetShader(sp);

        //mapping
        RC.SetShaderParam(_vTextureParam, new float4(0.0f, 1.0f, 0.0f, 1.0f));
        RC.Render(Mesh);


        Present();
}
    public override void Resize()
        {
            RC.Viewport(0, 0, Width, Height);

            float aspectRatio = Width / (float)Height;
           RC.Projection = float4x4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspectRatio, 1, 5000);
        }

两个程序并排 并排

我还应该添加的是,一旦我的 ModelView 标识的值大于 1.5,我的窗口中什么都看不到?有谁知道这可能会导致这种情况?

我编辑了帖子和图片,所以你看到了更大的不同。我在这篇文章的前面有身份矩阵。如果我将身份矩阵与此 Obj 文件一起使用

v 0.0 0.5 0.5
v 0.5 0.0 0.5
v -0.5 0.0 0.5

vt 1 0 0
vt 0 1 0
vt 0 0 0

f 1/2 2/3 3/1

我在我的 SharpDX 项目中看到了三角形,而在我的 openTK 中没有。但我认为茶壶的东西更好一点,以显示项目中只有 Shadercode 不同的差异!我的意思是我可能在这个Enginge 的SharpDX 实现中做错了,但让我们假设它们是正确的。至少我希望如此,如果你们告诉我 ShaderCode 是错误的;)

我希望我能清楚地描述我的问题,以便您理解。

4

1 回答 1

0

好的,所以你必须转置矩阵......

于 2013-07-29T12:55:27.687 回答