I try to learn HLSL and GLSL. For testing purpose, I would like to flip a given texture (compositor) vertically. In my test program I'm using Ogre 2. Depending on the used render system I create the shader programs:
Code: Select all
Ogre::HighLevelGpuProgramPtr m_VS; //!< Vertex-Shader
Ogre::HighLevelGpuProgramPtr m_PS; //!< Pixel-Shader
Code: Select all
m_strShaderLanguage = "hlsl";
m_strVersionVertexShader = "vs_2_0";
m_strVersionPixelShader = "ps_2_0";
// Create vertex shader
m_VS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNameVertexShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_VERTEX_PROGRAM);
m_VS->setSource("struct VS_IN\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"struct VS_OUT\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"VS_OUT VS( VS_IN vIn )\n"
"{\n"
" VS_OUT vOut;\n"
" vOut.pos = vIn.pos;\n"
" vOut.pos.z = 0;\n"
" vOut.tex = vIn.tex;\n"
" return vIn;\n"
"}\n");
m_VS->setParameter("target", m_strVersionVertexShader);
m_VS->setParameter("entry_point", "VS");
// Create pixel shader
m_PS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNamePixelShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_FRAGMENT_PROGRAM);
m_PS->setSource("uniform extern texture texContent;\n"
"\n"
"sampler samContent = sampler_state\n"
"{\n"
" Texture = <texContent>;\n"
"};\n"
"\n"
"\n"
"struct VS_IN\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"float4 PS( VS_IN vIn ) : COLOR\n"
"{\n"
" float2 flip = { 1.0 - vIn.tex[0], vIn.tex[1] };\n"
" return tex2D( samContent, flip );\n"
"}\n");
m_PS->setParameter("target", m_strVersionPixelShader);
m_PS->setParameter("entry_point", "PS");
Code: Select all
m_strShaderLanguage = "hlsl";
m_strVersionVertexShader = "vs_4_0";
m_strVersionPixelShader = "ps_4_0";
// Create vertex shader
m_VS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNameVertexShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_VERTEX_PROGRAM);
m_VS->setSource("struct VS_IN\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"struct VS_OUT\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"VS_OUT VS( VS_IN vIn )\n"
"{\n"
" VS_OUT vOut;\n"
" vOut.pos = vIn.pos;\n"
" vOut.pos.z = 0;\n"
" vOut.tex = vIn.tex;\n"
" return vOut;\n"
"}\n");
m_VS->setParameter("target", m_strVersionVertexShader);
m_VS->setParameter("entry_point", "VS");
// Create pixel shader
m_PS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNamePixelShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_FRAGMENT_PROGRAM);
m_PS->setSource("Texture2D texContent;\n"
"SamplerState samContent;\n"
"\n"
"struct VS_IN\n"
"{\n"
" float4 pos : POSITION;\n"
" float2 tex : TEXCOORD0;\n"
"};\n"
"\n"
"float4 PS( VS_IN vIn ) : SV_TARGET\n"
"{\n"
" float2 flip = { 1.0 - vIn.tex[0], vIn.tex[1] };\n"
" return texContent.Sample( samContent, flip );\n"
"}\n");
m_PS->setParameter("target", m_strVersionPixelShader);
m_PS->setParameter("entry_point", "PS");
Code: Select all
m_strShaderLanguage = "glsl";
m_strVersionVertexShader = "vp40";
m_strVersionPixelShader = "fp40";
// Create vertex shader
m_VS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNameVertexShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_VERTEX_PROGRAM);
m_VS->setSource("void main(void)\n"
"{\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
" gl_TexCoord[0] = gl_MultiTexCoord0;\n"
"}\n");
m_VS->setParameter("target", m_strVersionVertexShader);
m_VS->setParameter("entry_point", "main");
// Create pixel shader
m_PS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNamePixelShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_FRAGMENT_PROGRAM);
m_PS->setSource("uniform sampler2D texContent;\n"
"\n"
"void main(void)\n"
"{\n"
" vec2 inPos = gl_TexCoord[0];"
" gl_FragColor = texture2D(texContent, vec2(1.0 - inPos.x, inPos.y));\n"
"}\n");
m_PS->setParameter("target", m_strVersionPixelShader);
m_PS->setParameter("entry_point", "main");
Code: Select all
m_strShaderLanguage = "glsl";
m_strVersionVertexShader = "glsl420";
m_strVersionPixelShader = "glsl420";
// Create vertex shader
m_VS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNameVertexShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_VERTEX_PROGRAM);
m_VS->setSource("#version 420\n"
"\n"
"layout (location = 0) in vec3 VertexPosition;\n"
"\n"
"void main(void)\n"
"{\n"
" gl_Position = vec4(VertexPosition, 1.0);\n"
"}\n");
m_VS->setParameter("target", m_strVersionVertexShader);
m_VS->setParameter("entry_point", "main");
// Create pixel shader
m_PS = Ogre::HighLevelGpuProgramManager::getSingletonPtr()->createProgram(m_strNamePixelShader, m_strResourceGroup, m_strShaderLanguage, Ogre::GPT_FRAGMENT_PROGRAM);
m_PS->setSource("#version 420\n"
"layout(binding=0) uniform sampler2D texContent;\n"
"out vec4 FragColor;\n"
"\n"
"void main(void)\n"
"{\n"
" FragColor = texture2D(texContent, gl_SamplePosition);\n"
"}\n");
m_PS->setParameter("target", m_strVersionPixelShader);
m_PS->setParameter("entry_point", "main");
Thanks,
Transporter