2012年10月17日 星期三

跨GLSL與GLSLES shader code

主要目的是為了能在PC Windows上可以直接測試glsles(雖然有很多GLSL的內建變數無法使用,可能會造成GLSL可以跑,GLSLES卻無法執行的問題…),這樣可以加快開發GLSLES Shader的速度。

範例:

Vertex Shader Code:

//-----------------------------------------------------------------------------
//                         GLOBAL Defination
//-----------------------------------------------------------------------------
#ifdef USE_GL
  #version 120
#else
  #version 100
precision mediump int;
precision highp float;
#endif
//-----------------------------------------------------------------------------
//                         GLOBAL PARAMETERS
//-----------------------------------------------------------------------------
uniform mat4 worldviewproj_matrix;
//-----------------------------------------------------------------------------
//                         Vertex Inputs
//-----------------------------------------------------------------------------
attribute vec4 position;
attribute vec2 uv0;
//-----------------------------------------------------------------------------
//                         Vertex Outputs
//-----------------------------------------------------------------------------
//Outputs
//the name need to be the same pixel input name.
varying vec2 oUv;
//-----------------------------------------------------------------------------
// Function Name: main
// Function Desc: Vertex Program Entry point
//-----------------------------------------------------------------------------
void main()
{
gl_Position = worldviewproj_matrix*position;
oUv = uv0;
}
#####################################################################

Fragment Shader Code:

//-----------------------------------------------------------------------------
//                         GLOBAL Defination
//-----------------------------------------------------------------------------
#ifdef USE_GL
  #version 120
#else
  #version 100
precision mediump int;
precision highp float;
precision highp sampler2D;
#endif
//-----------------------------------------------------------------------------
//                         GLOBAL PARAMETERS
//-----------------------------------------------------------------------------
uniform sampler2D DiffuseMap;
//-----------------------------------------------------------------------------
//                         Pixel Inputs
//-----------------------------------------------------------------------------
varying vec2 oUv;
//-----------------------------------------------------------------------------
// Function Name: main
// Function Desc: Pixel Program Entry point
//-----------------------------------------------------------------------------
void main()
{
gl_FragColor = texture2D(DiffuseMap, oUv);
}
#####################################################################

Material Script:

vertex_program Base_VP_GLSL glsl
{
source Programs/Base_VP.glsles
 preprocessor_defines USE_GL=1
default_params
{
param_named_auto worldviewproj_matrix worldviewproj_matrix
}
}

vertex_program Base_VP_GLSLES glsles
{
source Programs/Base_VP.glsles
profiles glsles
default_params
{
param_named_auto worldviewproj_matrix worldviewproj_matrix
}
}

vertex_program Base_VP unified
{
delegate Base_VP_GLSLES
delegate Base_VP_GLSL
}

fragment_program Base_FP_GLSL glsl
{
source Programs/Base_FP.glsles
 preprocessor_defines USE_GL=1
default_params
{
param_named DiffuseMap int 0
}
}

fragment_program Base_FP_GLSLES glsles
{
source Programs/Base_FP.glsles
profiles glsles
default_params
{
param_named DiffuseMap int 0
}
}

fragment_program Base_FP unified
{
delegate Base_FP_GLSLES
delegate Base_FP_GLSL
}


material Template_Basic
{
technique
{
pass Base
{
// Vertex program reference
vertex_program_ref Base_VP
{
}
// Fragment program reference
fragment_program_ref Base_FP
{
}
texture_unit BaseMap
{
}
}
}
}



此範例OpenGL Render System來執行可以畫出跟GLSLES2.0一樣的結果。

備註:關於varying這個部份,GLSL ES2.0只要順序對,名稱不一樣也不會出錯,但GLSL則Vertex和Fragment Shader一定要一樣。

夢想還在持中…

2 則留言:

  1. NVIDIA有出OGL ES的模擬器,AMD的driver則有內建Native OGL ES,所以直接在PC上跑OGL ES應該是不需要再另外處理才對。

    回覆刪除
  2. 嗯!之前有試過Nevidia的OGL ES模擬器,但跑不起來,不知道是因為Ogre3D的問題還是那邊出錯…
    所以目前是用PC 跑OpenGL來測glsles的shader code,不過GLSL有很多內建變數GLSLES沒有支援,所以最正確的結果還是得到GLSLES的Device或IOS模擬器才能看到,找個時間來看看其他的模擬器方案。

    回覆刪除