Переглянути джерело

Samplers get enumerated as shader parameters

Marko Pintera 13 роки тому
батько
коміт
9fff9bad3e

+ 14 - 1
CamelotD3D9Renderer/Source/CmD3D9HLSLProgram.cpp

@@ -318,7 +318,8 @@ namespace CamelotEngine {
         else
         else
         {
         {
             // Process params
             // Process params
-            if (desc.Type == D3DXPT_FLOAT || desc.Type == D3DXPT_INT || desc.Type == D3DXPT_BOOL)
+            if (desc.Type == D3DXPT_FLOAT || desc.Type == D3DXPT_INT || desc.Type == D3DXPT_BOOL ||
+				desc.Type == D3DXPT_SAMPLER1D || desc.Type == D3DXPT_SAMPLER2D || desc.Type == D3DXPT_SAMPLER3D || desc.Type == D3DXPT_SAMPLERCUBE)
             {
             {
                 size_t paramIndex = desc.RegisterIndex;
                 size_t paramIndex = desc.RegisterIndex;
                 String name = prefix + paramName;
                 String name = prefix + paramName;
@@ -362,6 +363,18 @@ namespace CamelotEngine {
 		def.arraySize = d3dDesc.Elements;
 		def.arraySize = d3dDesc.Elements;
 		switch(d3dDesc.Type)
 		switch(d3dDesc.Type)
 		{
 		{
+		case D3DXPT_SAMPLER1D:
+			def.constType = GCT_SAMPLER1D;
+			break;
+		case D3DXPT_SAMPLER2D:
+			def.constType = GCT_SAMPLER2D;
+			break;
+		case D3DXPT_SAMPLER3D:
+			def.constType = GCT_SAMPLER3D;
+			break;
+		case D3DXPT_SAMPLERCUBE:
+			def.constType = GCT_SAMPLERCUBE;
+			break;
 		case D3DXPT_INT:
 		case D3DXPT_INT:
 			switch(d3dDesc.Columns)
 			switch(d3dDesc.Columns)
 			{
 			{

+ 52 - 52
CamelotRenderer/Source/CmApplication.cpp

@@ -57,42 +57,15 @@ namespace CamelotEngine
 
 
 		/////////////////// HLSL SHADERS //////////////////////////
 		/////////////////// HLSL SHADERS //////////////////////////
 		//String fragShaderCode = "sampler2D diffuseMap;			\
 		//String fragShaderCode = "sampler2D diffuseMap;			\
-		//	float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
-		//{														\
-		//	float4 color = tex2D(diffuseMap, uv);				\
-		//	return color;										\
-		//}";
+		//						float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
+		//						{														\
+		//						float4 color = tex2D(diffuseMap, uv);				\
+		//						return color;										\
+		//						}";
 
 
 		//mFragProg =  HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
 		//mFragProg =  HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "ps_main", "hlsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
 		//mFragProg->load();
 		//mFragProg->load();
 
 
-		//String vertShaderCode = "float4x4 matViewProjection;	\
-		//	void vs_main(										\
-		//	float4 inPos : POSITION,							\
-		//	float2 uv : TEXCOORD0,								\
-		//	out float4 oPosition : POSITION,					\
-		//	out float2 oUv : TEXCOORD0)							\
-		//{														\
-		//	oPosition = mul(matViewProjection, inPos);			\
-		//	oUv = uv;											\
-		//}";
-
-		//mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
-		//mVertProg->load();
-		
-
-
-		/////////////////// CG SHADERS //////////////////////////
-		//String fragShaderCode = "sampler2D diffuseMap;			\
-		//	float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
-		//{														\
-		//	float4 color = tex2D(diffuseMap, uv);				\
-		//	return color;										\
-		//}";
-
-		//mFragProg =  HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "ps_main", "cg", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
-		//mFragProg->load();
-
 		//String vertShaderCode = "float4x4 matViewProjection;	\
 		//String vertShaderCode = "float4x4 matViewProjection;	\
 		//						void vs_main(										\
 		//						void vs_main(										\
 		//						float4 inPos : POSITION,							\
 		//						float4 inPos : POSITION,							\
@@ -104,33 +77,60 @@ namespace CamelotEngine
 		//						oUv = uv;											\
 		//						oUv = uv;											\
 		//						}";
 		//						}";
 
 
-		//mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "cg", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		//mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "hlsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 		//mVertProg->load();
 		//mVertProg->load();
 		
 		
 
 
 
 
-		///////////////// GLSL SHADERS ////////////////////////////
-		String fragShaderCode = "uniform sampler2D tex; \
-									void main() \
-									  {\
-									  vec4 texColor = texture2D(tex,gl_TexCoord[0].st);\
-									  gl_FragColor = texColor; \
-									  }";
-
-		mFragProg = HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+		/////////////////// CG SHADERS //////////////////////////
+		String fragShaderCode = "sampler2D diffuseMap;			\
+			float4 ps_main(float2 uv : TEXCOORD0) : COLOR0		\
+		{														\
+			float4 color = tex2D(diffuseMap, uv);				\
+			return color;										\
+		}";
+
+		mFragProg =  HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "ps_main", "cg", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
 		mFragProg->load();
 		mFragProg->load();
 
 
-		// TODO - Ogres GLSL parsing requires some strict parameter naming, can that be avoided?
-		String vertShaderCode = "uniform mat4 matViewProjection; \
-									  attribute vec4 vertex; \
-								void main() \
-									  { \
-									  gl_TexCoord[0] = gl_MultiTexCoord0; \
-									  gl_Position = matViewProjection * vertex; \
-									  }";
-
-		mVertProg = HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		String vertShaderCode = "float4x4 matViewProjection;	\
+								void vs_main(										\
+								float4 inPos : POSITION,							\
+								float2 uv : TEXCOORD0,								\
+								out float4 oPosition : POSITION,					\
+								out float2 oUv : TEXCOORD0)							\
+								{														\
+								oPosition = mul(matViewProjection, inPos);			\
+								oUv = uv;											\
+								}";
+
+		mVertProg =  HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "vs_main", "cg", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
 		mVertProg->load();
 		mVertProg->load();
+		
+
+
+		///////////////// GLSL SHADERS ////////////////////////////
+		//String fragShaderCode = "uniform sampler2D tex; \
+		//							void main() \
+		//							  {\
+		//							  vec4 texColor = texture2D(tex,gl_TexCoord[0].st);\
+		//							  gl_FragColor = texColor; \
+		//							  }";
+
+		//mFragProg = HighLevelGpuProgramManager::instance().createProgram(fragShaderCode, "main", "glsl", GPT_FRAGMENT_PROGRAM, GPP_PS_2_0);
+		//mFragProg->load();
+
+		//// TODO - Ogres GLSL parsing requires some strict parameter naming, can that be avoided?
+		//String vertShaderCode = "uniform mat4 matViewProjection; \
+		//							  attribute vec4 vertex; \
+		//						void main() \
+		//							  { \
+		//							  gl_TexCoord[0] = gl_MultiTexCoord0; \
+		//							  gl_Position = matViewProjection * vertex; \
+		//							  }";
+
+		//mVertProg = HighLevelGpuProgramManager::instance().createProgram(vertShaderCode, "main", "glsl", GPT_VERTEX_PROGRAM, GPP_VS_2_0);
+		//mVertProg->load();
 
 
 
 
 		// IMPORTER TEST
 		// IMPORTER TEST

+ 13 - 5
CamelotRenderer/Source/CmCgProgram.cpp

@@ -219,16 +219,12 @@ namespace CamelotEngine {
 	{
 	{
 		while (parameter != 0)
 		while (parameter != 0)
         {
         {
-            // Look for uniform (non-sampler) parameters only
+            // Look for parameters
             // Don't bother enumerating unused parameters, especially since they will
             // Don't bother enumerating unused parameters, especially since they will
             // be optimised out and therefore not in the indexed versions
             // be optimised out and therefore not in the indexed versions
             CGtype paramType = cgGetParameterType(parameter);
             CGtype paramType = cgGetParameterType(parameter);
 
 
             if (cgGetParameterVariability(parameter) == CG_UNIFORM &&
             if (cgGetParameterVariability(parameter) == CG_UNIFORM &&
-                paramType != CG_SAMPLER1D &&
-                paramType != CG_SAMPLER2D &&
-                paramType != CG_SAMPLER3D &&
-                paramType != CG_SAMPLERCUBE &&
                 paramType != CG_SAMPLERRECT &&
                 paramType != CG_SAMPLERRECT &&
                 cgGetParameterDirection(parameter) != CG_OUT && 
                 cgGetParameterDirection(parameter) != CG_OUT && 
                 cgIsParameterReferenced(parameter))
                 cgIsParameterReferenced(parameter))
@@ -360,6 +356,18 @@ namespace CamelotEngine {
 		{
 		{
 			switch(cgType)
 			switch(cgType)
 			{
 			{
+			case CG_SAMPLER1D:
+				def.constType = GCT_SAMPLER1D;
+				break;
+			case CG_SAMPLER2D:
+				def.constType = GCT_SAMPLER2D;
+				break;
+			case CG_SAMPLER3D:
+				def.constType = GCT_SAMPLER3D;
+				break;
+			case CG_SAMPLERCUBE:
+				def.constType = GCT_SAMPLERCUBE;
+				break;
 			case CG_FLOAT:
 			case CG_FLOAT:
 			case CG_FLOAT1:
 			case CG_FLOAT1:
 			case CG_HALF:
 			case CG_HALF: