paroj wrote: Sun Feb 24, 2019 7:30 pm
try using the glslf/ glslv cg profiles and inspect the generated source code that will be in the log - it will be you only chance getting this working on non-nvidia hardware anyway.
Thank you! This helped A LOT to debug why the shaders do not work.
The generated glsl code used "dot" instead of just doing "v * m" of matrices, which I was able to fix by doing the matrix multiplication manually in the shader (which translates later to glsl perfectly).
Though there is still one obstacle that I cannot seem to fix, gl_MultiTexCoordX does not seem to work, at all.
This is now my adjusted vertex hlsl shader (which I use for CG):
Code: Select all
float4x4 viewProjMatrix;
struct VS_OUTPUT
{
float2 oUV : TEXCOORD0;
};
VS_OUTPUT main_vs( float4 position : POSITION,
out float4 oPosition : POSITION,
float2 iUV : TEXCOORD0,
float4 mat14 : TEXCOORD1,
float4 mat24 : TEXCOORD2,
float4 mat34 : TEXCOORD3 )
{
VS_OUTPUT Out;
float4 worldPos;
worldPos.x = dot(mat14, position);
worldPos.y = dot(mat24, position);
worldPos.z = dot(mat34, position);
worldPos.w = 1;
oPosition.x = dot(float4(viewProjMatrix[0].x, viewProjMatrix[1].x, viewProjMatrix[2].x, viewProjMatrix[3].x), worldPos);
oPosition.y = dot(float4(viewProjMatrix[0].y, viewProjMatrix[1].y, viewProjMatrix[2].y, viewProjMatrix[3].y), worldPos);
oPosition.z = dot(float4(viewProjMatrix[0].z, viewProjMatrix[1].z, viewProjMatrix[2].z, viewProjMatrix[3].z), worldPos);
oPosition.w = dot(float4(viewProjMatrix[0].w, viewProjMatrix[1].w, viewProjMatrix[2].w, viewProjMatrix[3].w), worldPos);
Out.oUV = iUV;
return Out;
}
That gets turned into this (seen from the log file as you mentioned):
Code: Select all
vec4 _oPosition1;
vec4 _a0008;
vec4 _a0010;
vec4 _a0012;
vec4 _a0014;
uniform mat4 viewProjMatrix;
void main()
{
vec4 _worldPos;
_worldPos.x = dot(gl_MultiTexCoord1, gl_Vertex);
_worldPos.y = dot(gl_MultiTexCoord2, gl_Vertex);
_worldPos.z = dot(gl_MultiTexCoord3, gl_Vertex);
_worldPos.w = 1.00000000E+000;
_a0008 = vec4(viewProjMatrix[0].x, viewProjMatrix[1].x, viewProjMatrix[2].x, viewProjMatrix[3].x);
_oPosition1.x = dot(_a0008, _worldPos);
_a0010 = vec4(viewProjMatrix[0].y, viewProjMatrix[1].y, viewProjMatrix[2].y, viewProjMatrix[3].y);
_oPosition1.y = dot(_a0010, _worldPos);
_a0012 = vec4(viewProjMatrix[0].z, viewProjMatrix[1].z, viewProjMatrix[2].z, viewProjMatrix[3].z);
_oPosition1.z = dot(_a0012, _worldPos);
_a0014 = vec4(viewProjMatrix[0].w, viewProjMatrix[1].w, viewProjMatrix[2].w, viewProjMatrix[3].w);
_oPosition1.w = dot(_a0014, _worldPos);
gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;
gl_Position = _oPosition1;
return;
}
And that shader does not work, but if I alter it to this, it works:
Code: Select all
vec4 _oPosition1;
vec4 _a0008;
vec4 _a0010;
vec4 _a0012;
vec4 _a0014;
uniform mat4 viewProjMatrix;
attribute vec4 uv1;
attribute vec4 uv2;
attribute vec4 uv3;
void main()
{
vec4 _worldPos;
_worldPos.x = dot(uv1, gl_Vertex);
_worldPos.y = dot(uv2, gl_Vertex);
_worldPos.z = dot(uv3, gl_Vertex);
_worldPos.w = 1.00000000E+000;
_a0008 = vec4(viewProjMatrix[0].x, viewProjMatrix[1].x, viewProjMatrix[2].x, viewProjMatrix[3].x);
_oPosition1.x = dot(_a0008, _worldPos);
_a0010 = vec4(viewProjMatrix[0].y, viewProjMatrix[1].y, viewProjMatrix[2].y, viewProjMatrix[3].y);
_oPosition1.y = dot(_a0010, _worldPos);
_a0012 = vec4(viewProjMatrix[0].z, viewProjMatrix[1].z, viewProjMatrix[2].z, viewProjMatrix[3].z);
_oPosition1.z = dot(_a0012, _worldPos);
_a0014 = vec4(viewProjMatrix[0].w, viewProjMatrix[1].w, viewProjMatrix[2].w, viewProjMatrix[3].w);
_oPosition1.w = dot(_a0014, _worldPos);
gl_TexCoord[0].xy = gl_MultiTexCoord0.xy;
gl_Position = _oPosition1;
return;
}
As you may see, I altered the gl_MultiTexCoordX to use the "attribute vec4 uvX" instead, and then everything works.
So my question is, why are the values of gl_MultiTexCoordX scrambled/incorrect?
Should not those values be the same as the attribute values?
Is there some way to fix this?