Page 1 sur 1

CG shader non supporté ?

Publié : jeu. 03/juin/2010 16:33
par kelebrindae
Bonjour,

J'essaie de faire marcher un shader CG mais dès la première passe (qui ne fait pourtant rien de compliqué), ça ne marche pas :( : j'ai dans le ogre.log le message suivant:
17:22:11: WARNING: material 01_-_Default has no supportable Techniques and will be blank. Explanation:
Pass 0: Vertex program Ogre/BasicVertexPrograms/AmbientOneTexture cannot be used - not supported.
"not supported", ça me paraît bizarre, car ce shader est vs1.1 et ps1.1, ce que ma carte supporte théoriquement sans problème... :?
17:07:51: * Supported Shader Profiles: hlsl ps_1_1 ps_1_2 ps_1_3 ps_1_4 ps_2_0 ps_2_a ps_2_b ps_2_x ps_3_0 vs_1_1 vs_2_0 vs_2_a vs_2_x vs_3_0
Voici le mesh, le material, le shader, les textures, etc.. + le viewer de Djes pour tester:
http://keleb.free.fr/pb/cgShader-normalMap.zip

Quelqu'un pourrait me dire ce qui ne va pas ?

[EDIT]
Le fichier .zip a été mis à jour avec le shader converti en HLSL via le CG compiler de nVidia.

[EDIT 2]
Le fichier .zip a été mis à jour avec le shader corrigé (#pragma... et Tangent, cf. plus bas)

Re: CG shader non supporté ?

Publié : jeu. 03/juin/2010 17:44
par G-Rom
Non , sous windows pour le moment uniquement HLSL , sous linux GLSL , avec la 4.6 logiquement sous windows tu auras en plus glsl.
c'est pour des raisons techniques d'une part mais je ne m'étendrais pas sur le sujet , et de licence il me semble.

donc , tu n'aura jamais le support de CG.

@+

Re: CG shader non supporté ?

Publié : jeu. 03/juin/2010 18:32
par djes
En même temps, il est relativement facile de compiler un shader CG en un autre type. Télécharge le pack de dév CG sur le site de NVidia pour avoir le compilateur. Ça te permettra en plus d'aller beaucoup plus loin au niveau du développement des shaders.

Re: CG shader non supporté ?

Publié : ven. 04/juin/2010 14:28
par kelebrindae
Ah, ok, je comprends mieux...

J'ai donc téléchargé le CG toolkit de nVidia, et j'ai converti les shaders CG en HLSL avec le CG compiler, puis adapté le .material.
=> Plus de message d'erreur dans ogre.log, mais le shader ne fonctionne toujours pas, et je ne vois pas pourquoi... :?

J'ai mis à jour le zip pour intégrer le nouveau .material et le shader HLSL: http://keleb.free.fr/pb/cgShader-normalMap.zip

Djes, toi qui t'es déjà frotté à ce genre de conversion, peux-tu me dire si j'ai loupé une étape?
Merci d'avance !

Re: CG shader non supporté ?

Publié : ven. 04/juin/2010 15:48
par djes
Il y a plusieurs soucis. D'abord avec la caméra, il faudrait que tu reprennes mon code pour le calcul

Code : Tout sélectionner

;Little computation to convert our pixels window to the % ogre
    level_min_x  = 0
    level_min_y  = 0
    level_max_x  = 1024
    level_max_y  = 768
    level_width  = level_max_x - level_min_x
    level_height = level_max_y - level_min_y
    CreateCamera(0, (level_min_x * 100) / ScreenWidth, (level_min_y * 100) / ScreenHeight, (level_width * 100) / ScreenWidth, (level_width * 100) / ScreenWidth)
Ensuite, en faisant ça

Code : Tout sélectionner

      CameraLocate(0, (1 + Sin(i / 2)) * 5 * Sin(i * 0.4), 5 * Sin(i), (1 + Sin(i / 2)) * 5 * Cos(i * 0.4))
on voit ton objet, mais celui-ci est bizarre. Tu n'as pas l'original? J'ai l'impression que la conversion a foiré.

Re: CG shader non supporté ?

Publié : ven. 04/juin/2010 15:55
par djes
En bidouillant un peu ton material

Code : Tout sélectionner

vertex_program Ogre/BasicVertexPrograms/AmbientOneTexture hlsl
{
   source ambientOneTexture.hlsl
   entry_point ambientOneTexture_vp
   target vs_1_1
			

   default_params
   {
				param_named_auto _worldViewProj worldviewproj_matrix
				param_named _ambient float4 20 20 20 0
   }  
}

vertex_program Examples/BumpMapVPSpecular hlsl
{
   source specular_vp.hlsl
   entry_point specular_vp
   target vs_1_1

   default_params
   {
        param_named_auto _lightPosition light_position_object_space 0
				param_named_auto _eyePosition camera_position_object_space
				param_named_auto _worldViewProj worldviewproj_matrix			
   }  
}

fragment_program Examples/BumpMapFPSpecular hlsl
{
   source specular_fp.hlsl
   entry_point specular_fp
   target ps_1_1

   default_params
   {      
				param_named_auto _lightDiffuse light_diffuse_colour 0
				param_named_auto _lightSpecular light_specular_colour 0
   }  
}

material 01_-_Default
{
	technique
	{
		pass
		{
			max_lights 3
			diffuse 0 0 0 1
			specular 0 0 0 1 20

			vertex_program_ref Ogre/BasicVertexPrograms/AmbientOneTexture {}
		}

		pass
		{
			max_lights 3
			iteration once_per_light
			ambient 0.588235 0.588235 0.588235 1
			diffuse 0.588235 0.588235 0.588235 1
			specular 0 0 0 1 10
			scene_blend add

			vertex_program_ref Examples/BumpMapVPSpecular {}

			fragment_program_ref Examples/BumpMapFPSpecular	{}

			texture_unit 0
			{
				texture_alias rockNm
				texture rockwall_NH.tga
				colour_op_ex source1 src_texture src_current
				colour_op_multipass_fallback dest_colour zero
			}

			texture_unit 1
			{
				texture_alias cubeNorm
				cubic_texture nm.dds combinedUVW
				tex_coord_set 1
				tex_address_mode clamp
			}

			texture_unit 2
			{
				texture_alias cubeNorm2
				cubic_texture nm.dds combinedUVW
				tex_coord_set 2
				tex_address_mode clamp
			}
		}

		pass
		{
			lighting off
			max_lights 3
			//scene_blend modulate

			//vertex_program_ref Ogre/BasicVertexPrograms/AmbientOneTexture {}

			texture_unit 0
			{
				texture_alias rockTx
				texture rockwall.tga
			}
		}

	}

}
et la position de la caméra

Code : Tout sélectionner

      CameraLocate(0, (1 + Sin(i / 2)) * 500 * Sin(i * 0.4), 500 * Sin(i), (1 + Sin(i / 2)) * 500 * Cos(i * 0.4))
on commence à y voir quelque chose. Tu as bien préparé ton objet?

Re: CG shader non supporté ?

Publié : ven. 04/juin/2010 18:01
par G-Rom
djes a écrit :Il y a plusieurs soucis. D'abord avec la caméra, il faudrait que tu reprennes mon code pour le calcul

Code : Tout sélectionner

;Little computation to convert our pixels window to the % ogre
    level_min_x  = 0
    level_min_y  = 0
    level_max_x  = 1024
    level_max_y  = 768
    level_width  = level_max_x - level_min_x
    level_height = level_max_y - level_min_y
    CreateCamera(0, (level_min_x * 100) / ScreenWidth, (level_min_y * 100) / ScreenHeight, (level_width * 100) / ScreenWidth, (level_width * 100) / ScreenWidth)
Ensuite, en faisant ça

Code : Tout sélectionner

      CameraLocate(0, (1 + Sin(i / 2)) * 5 * Sin(i * 0.4), 5 * Sin(i), (1 + Sin(i / 2)) * 5 * Cos(i * 0.4))
on voit ton objet, mais celui-ci est bizarre. Tu n'as pas l'original? J'ai l'impression que la conversion a foiré.
je comprend pas le calcul , il sert à quoi ?
car les paramètres de la caméra défini la taille ( et la position ) sur l'écran 2D

0,0 le coin haut gauche
100,100 le coin en bas à droite.

bien évidement en %
je suppose que tu le sais déjà , mais je pige pas ton code :)

Re: CG shader non supporté ?

Publié : ven. 04/juin/2010 19:56
par djes
C'est un bête calcul de pourcentage, à partir d'une taille et d'une position données en pixels.

Re: CG shader non supporté ?

Publié : lun. 07/juin/2010 15:23
par kelebrindae
Ok, je crois que j'ai réussi à le faire marcher au prix de modifications minimes. 8)

Je pense que ces adaptations peuvent être généralisées pour toutes conversions Cg => Hlsl réalisée avec Cg Compiler:
- dans les shaders, virer "#pragma pack_matrix(row_major)", parce que Ogre met déjà les matrices dans le bon ordre et que si on le laisse, ça pourrit toute la géométrie;
- dans les vertex shaders qui utilise l'attribut "Tangent" stocké dans le mesh, remplacer les ":TEXCOORD1" par ":TANGENT" (pour les paramètres d'entrée uniquement).

Juste avec ces deux précautions, ça marche nickel : la conversion d'un shader CG en HLSL grâce au CG Compiler de nVidia semble donc être assez facile; Merci Djes! :D

Pour ceux qui veulent jeter un oeil, j'ai modifié le .zip pour inclure un exemple corrigé et plus parlant
=> http://keleb.free.fr/pb/cgShader-normalMap.zip

Re: CG shader non supporté ?

Publié : lun. 07/juin/2010 16:52
par Fred
Tu pourrais mettre le shader CG original ainsi que la ligne de commande utilisée par cg.exe pour la conversion du shader SVP ?

Re: CG shader non supporté ?

Publié : mar. 08/juin/2010 11:02
par kelebrindae
Pas de problème. :)

Voici les sources des CG shaders d'origine:

Code : Tout sélectionner

/*
  Basic ambient lighting vertex program
*/
void ambientOneTexture_vp(float4 position : POSITION,
						  float2 uv		  : TEXCOORD0,
						  
						  out float4 oPosition : POSITION,
						  out float2 oUv	   : TEXCOORD0,
						  out float4 colour    : COLOR,

						  uniform float4x4 worldViewProj,
						  uniform float4 ambient)
{
	oPosition = mul(worldViewProj, position);
	oUv = uv;
	colour = ambient;
}

Code : Tout sélectionner

// General functions
// Expand a range-compressed vector
float3 expand(float3 v)
{
	return (v - 0.5) * 2;
}

void main_fp( float2 uv			: TEXCOORD0,
			  float3 TSlightDir : TEXCOORD1,
			  out float4 colour	: COLOR,
			  uniform float4 lightDiffuse,
			  uniform sampler2D   normalMap,
			  uniform samplerCUBE normalCubeMap)
{
	// retrieve normalised light vector, expand from range-compressed
	float3 lightVec = expand(texCUBE(normalCubeMap, TSlightDir).xyz);

	// get bump map vector, again expand from range-compressed
	float3 bumpVec = expand(tex2D(normalMap, uv).xyz);

	// Calculate dot product
	colour = lightDiffuse * dot(bumpVec, lightVec);
}

/* Vertex program which includes specular component */
void specular_vp(float4 position	: POSITION,
			 	 float3 normal		: NORMAL,
			 	 float2 uv			: TEXCOORD0,
			 	 float3 tangent     : TEXCOORD1,
			 	 // outputs
			 	 out float4 oPosition    : POSITION,
			 	 out float2 oUv			 : TEXCOORD0,
			 	 out float3 oTSLightDir	 : TEXCOORD1,
				 out float3 oTSHalfAngle : TEXCOORD2,
			 	 // parameters
				 uniform float4 lightPosition, // object space
			 	 uniform float3 eyePosition,   // object space
			 	 uniform float4x4 worldViewProj)
{
	// calculate output position
	oPosition = mul(worldViewProj, position);

	// pass the main uvs straight through unchanged
	oUv = uv;

	// calculate tangent space light vector
	// Get object space light direction
	float3 lightDir = normalize(lightPosition.xyz -  (position * lightPosition.w));

	// Calculate the binormal (NB we assume both normal and tangent are
	// already normalised)
	// NB looks like nvidia cross params are BACKWARDS to what you'd expect
	// this equates to NxT, not TxN
	float3 binormal = cross(tangent, normal);
	
	// Form a rotation matrix out of the vectors
	float3x3 rotation = float3x3(tangent, binormal, normal);
	
	// Transform the light vector according to this matrix
	oTSLightDir = normalize(mul(rotation, lightDir));

	// Calculate half-angle in tangent space
	float3 eyeDir = eyePosition - position.xyz;
	float3 halfAngle = normalize(eyeDir + lightDir);
	oTSHalfAngle = mul(rotation, halfAngle);
}

/* Fragment program which supports specular component */
void specular_fp( float2 uv			: TEXCOORD0,
			  float3 TSlightDir : TEXCOORD1,
			  float3 TShalfAngle: TEXCOORD2,

			  out float4 colour	: COLOR,

			  uniform float4 lightDiffuse,
			  uniform float4 lightSpecular,
			  uniform sampler2D   normalMap : register(s0),
			  uniform samplerCUBE normalCubeMap : register(s1), 
			  uniform samplerCUBE normalCubeMap2 : register(s2)) // we need this second binding to be compatible with ps_1_1, ps_2_0 could reuse the other
{
	// retrieve normalised light vector, expand from range-compressed
	float3 lightVec = expand(texCUBE(normalCubeMap, TSlightDir).xyz);

	// retrieve half angle and normalise through cube map
	float3 halfAngle = expand(texCUBE(normalCubeMap2, TShalfAngle).xyz);

	// get bump map vector, again expand from range-compressed
	float3 bumpVec = expand(tex2D(normalMap, uv).xyz);

	// Pre-raise the specular exponent to the eight power
	// Note we have no 'pow' function in basic fragment programs, if we were willing to accept compatibility
	// with ps_2_0 / arbfp1 and above, we could have a variable shininess parameter
	// This is equivalent to 
	float specFactor = dot(bumpVec, halfAngle);
	for (int i = 0; i < 3; ++i)
		specFactor *= specFactor;
	

	// Calculate dot product for diffuse
	colour = (lightDiffuse * saturate(dot(bumpVec, lightVec))) + 
			(lightSpecular * specFactor);
	
}
Et j'avais aussi ce fichier ".program" qui donnait les entry points, les profils vs/ps, etc..

Code : Tout sélectionner

//---------------------------------------------------
// This file includes a number of basic GPU programs
// for use in many materials. 
//---------------------------------------------------

// A really basic ambient pass program, support for one texture coodinate set
vertex_program Ogre/BasicVertexPrograms/AmbientOneTexture cg
{
	source Example_Basic.cg
	entry_point ambientOneTexture_vp
	profiles vs_1_1
}

// Bump map with specular vertex program, support for this is required
vertex_program Examples/BumpMapVPSpecular cg
{
	source Example_BumpMapping.cg
	entry_point specular_vp
	profiles vs_1_1
}

// Bump map fragment program, support for this is optional
fragment_program Examples/BumpMapFPSpecular cg
{
	source Example_BumpMapping.cg
	entry_point specular_fp
	profiles ps_1_1
}
Maintenant, les lignes de commandes du CG compiler (version 2.2 de février 2010):

Code : Tout sélectionner

cgc.exe -entry ambientOneTexture_vp -profile hlslv example_Basic.cg -o ambientOneTexture.hlsl

cgc.exe -entry specular_vp -profile hlslv example_bumpmapping.cg -o specular_vp.hlsl

cgc.exe -entry specular_fp -profile hlslf example_bumpmapping.cg -o specular_fp.hlsl
Petite précision: dans les fichiers ".hlsl" générés, les entry points sont renommés "main" par le CG compiler; j'ai préféré leur redonner leur nom d'origine, mais à part pour s'y retrouver plus facilement, je ne crois pas que cela soit nécessaire.