WorldViewProj?

Started by
7 comments, last by Zakwayda 12 years, 10 months ago
Hello,
First, sorry for my bad English..

I have question about GLSL,
I have a HLSL shader, In this shader, I use a World and a WorldViewProj matrices.
In DirectX, I can easily get these Matrices with this codes;

World:

D3DXMatrixIdentity(&World);

View:
D3DXMatrixLookAtLH(&View, &Position, &Target, &Up);

Proj:
D3DXMatrixPerspectiveFovLH( &Proj, D3DX_PI /4, ScreenWidth / ScreenHeight, 1.0f, 1000.0f );

WorldViewProj:
World * View * Proj

I've converted my HLSL shader to GLSL with "HLSL2GLSL" tool.
My shader compiles with no errors. But I need this matrices to use my shader..
And I don't know how to get these Matrices in OpenGL.. sad.gif

I've searched but I couldn't find a solution.
Can anyone tell me how can I get these matrices in OpenGL?
Advertisement
[color="#FF0000"] D3DXMatrixIdentity(&World); --> [color="#2E8B57"]glLoadIdentity(....

[color="#FF0000"]D3DXMatrixLookAtLH(&View, &Position, &Target, &Up); --> [color="#2E8B57"]gluLookAt(...

[color="#FF0000"]D3DXMatrixPerspectiveFovLH -->[color="#2E8B57"]gluPerspective(....

[color="#FF0000"]World * View * Proj --> [color="#2E8B57"]MODELVIEW * PROJECTION
Depends on the opengl version. Older versions of opengl provided them as built in uniforms, in the newer versions of opengl you have to calculate them yourself and pass them to the shader. Most math libs built with graphics in mind should have calls to calculate them.
See my link. Look for functions like glhLoadIdentityf2.
Build your matrix and upload to your shader.
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);

See my link. Look for functions like glhLoadIdentityf2.
Build your matrix and upload to your shader.



I think this library is for Windows, but i'm using Linux :(

------

I have some matrices in GLSL shader..
For example:
gl_ModelViewProjectionMatrix
gl_ModelViewMatrix
gl_Vertex

What is ModelView Matrix?? is that same with ViewMatrix in DX?
Ok, I think gl_ModelViewProjectionMatrix is WorldViewProj matrix, is it right?

But how can I get the World matrix?

A part of my Shader is like this.. very simple..

---------------------------------------------------------------------------------------------------------------
uniform vec4 LightColor;
uniform vec4 LightPosition;
uniform vec4 MatColor;
uniform mat4 World;
uniform mat4 WorldViewProjection;


void VS( in A2V IN, out V2P OUT ) {

OUT.Pos = [color="#ff0000"]I NEED HELP HERE.. (in DX, it is mul(IN.Position, WorldViewProj); )
OUT.WorldPos = [color="#ff0000"]I NEED HELP HERE TOO.. (in DX it is mul(IN.Position, World); )
OUT.LightDir = vec3( (LightPosition - OUT.WorldPos));
OUT.WorldNormal = normalize( ( IN.Normal * xlat_lib_constructMat3( World) ) );
OUT.Diffuse = (MatColor * LightColor);
OUT.TexCoord0 = IN.Tex0;
}
---------------------------------------------------------------------------------------------------------------
Regarding the terminology, with the fixed-function pipeline, the 'world' matrix in D3D corresponds to the 'model' matrix in OpenGL, so:

D3D: world->view->projection
OpenGL: model->view->projection

Furthermore, OpenGL collapses the model and view matrices into a single 'modelview' matrix, whereas D3D keeps the world and view matrices separate, so:

D3D: world->view->projection
OpenGL: modelview->projection

With modern shader code, all of this disappears and you just construct and use whatever matrices you need. Typically there'll still be 'model', 'view', and 'projection' transforms in one form or another, but which ones you upload and what you do with them exactly is up to you. (That said, the simplest possible vertex program will typically transform all incoming geometry by a single matrix that represents a concatenation of the model/world, camera/view, and projection transforms.)
Ok, Its working smile.gif

I used so, and I don't need Model Matrix anymore smile.gif
-------------------------------

OUT.Pos = gl_ModelViewProjectionMatrix * gl_Vertex;
OUT.WorldPos = gl_ModelViewMatrix * gl_Vertex;
OUT.LightDir = LightPosition - OUT.WorldPos;
OUT.WorldNormal = normalize(gl_NormalMatrix * gl_Normal);
OUT.Diffuse = LightColor;
OUT.TexCoord0 = IN.Tex0;
-------------------------------

Thanks guys..
The only problem with that is that you are using built in variables. Why don't you use a math library instead?
From http://opengl.org/wiki/Related_toolkits_and_APIs, there is the GLM library that is available for *nix. It is object orientated (compared to mine which is a C library). I don't like the OO approach but have a look. There are a lot of others too if you look at the big list at http://www.gamedev.net/topic/339189-unofficial-alternative-game-libraries-faq-updated-20308/
Sig: http://glhlib.sourceforge.net
an open source GLU replacement library. Much more modern than GLU.
float matrix[16], inverse_matrix[16];
glhLoadIdentityf2(matrix);
glhTranslatef2(matrix, 0.0, 0.0, 5.0);
glhRotateAboutXf2(matrix, angleInRadians);
glhScalef2(matrix, 1.0, 1.0, -1.0);
glhQuickInvertMatrixf2(matrix, inverse_matrix);
glUniformMatrix4fv(uniformLocation1, 1, FALSE, matrix);
glUniformMatrix4fv(uniformLocation2, 1, FALSE, inverse_matrix);
@The OP: You can find another list of game math libraries here.

This topic is closed to new replies.

Advertisement