C# GLSL和HLSL之间的Modelview差异?
我想知道GLSL和HLSL数学之间是否有区别。 我使用的是一个自制的引擎,它与openTK配合使用。我的SharpDx实现每天都会更进一步。 我目前正在处理ModelviewProjection矩阵。 为了看看它是否有效,我使用了一个简单的项目,它可以与OpenTK配合使用。 因此,我将着色器代码从GLSL更改为HLSL,因为程序的其余部分使用引擎函数。程序不起作用,我看不到几何体,所以我将模型视图矩阵和投影矩阵更改为单位矩阵。工作之后,我看到了几何图形。所以我对GLSL做了一点修改,因为我想要一个与HLSL相似的GLSL代码,我还将矩阵修改为identity。后来我什么也没看到,没用。。。。所以我被卡住了。。。你们有什么想法吗? 总之,长话短说 我的HLSL着色器代码C# GLSL和HLSL之间的Modelview差异?,c#,glsl,hlsl,sharpdx,model-view,C#,Glsl,Hlsl,Sharpdx,Model View,我想知道GLSL和HLSL数学之间是否有区别。 我使用的是一个自制的引擎,它与openTK配合使用。我的SharpDx实现每天都会更进一步。 我目前正在处理ModelviewProjection矩阵。 为了看看它是否有效,我使用了一个简单的项目,它可以与OpenTK配合使用。 因此,我将着色器代码从GLSL更改为HLSL,因为程序的其余部分使用引擎函数。程序不起作用,我看不到几何体,所以我将模型视图矩阵和投影矩阵更改为单位矩阵。工作之后,我看到了几何图形。所以我对GLSL做了一点修改,因为我想要
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,200500,0,0,0,0,1,0)
这两个项目并排进行
我还应该补充的是,只要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中没有看到。但我认为茶壶的东西更好一点,以显示to项目中的差异,其中只有着色器代码是不同的!我的意思是,我可能会在这个引擎的SharpDX实现中出错,但让我们假设他们的一切都是正确的。至少我希望如此,如果你们告诉我ShaderCode是错误的;)
我希望我能清楚地描述我的问题,以便您理解。好的,那么您必须转置矩阵…
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