我想知道 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 是错误的;)
我希望我能清楚地描述我的问题,以便您理解。