主要目的是為了能在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一定要一樣。
夢想還在持中…
NVIDIA有出OGL ES的模擬器,AMD的driver則有內建Native OGL ES,所以直接在PC上跑OGL ES應該是不需要再另外處理才對。
回覆刪除嗯!之前有試過Nevidia的OGL ES模擬器,但跑不起來,不知道是因為Ogre3D的問題還是那邊出錯…
回覆刪除所以目前是用PC 跑OpenGL來測glsles的shader code,不過GLSL有很多內建變數GLSLES沒有支援,所以最正確的結果還是得到GLSLES的Device或IOS模擬器才能看到,找個時間來看看其他的模擬器方案。