демка: BloodyTest02
common материалы:
default { color parm0 parm1 parm2 parm3 shader shaders/ubergeneric { } } defaultDeferred { color parm0 parm1 parm2 parm3 sort deferred shader shaders/ubergeneric { } } defaultFont { color parm0 parm1 parm2 parm3 diffuseMap textures/fonts/chars.tga linear_clamp shader shaders/ubernomip { blendFunc blend } } defaultConsole { color parm0 parm1 parm2 parm3 diffuseMap textures/bloody.tga linear_repeat shader shaders/ubernomip { blendFunc none translate 0.00005 * time, 0.0 } { blendFunc filter translate 0.0, 0.00005 * time } { blendFunc add translate 0.00005 * time, 0.00005 * time } { blendFunc filter translate -0.00005 * time, 0.0 } { blendFunc add translate 0.0, -0.00005 * time } { blendFunc filter translate -0.00005 * time, -0.00005 * time } { blendFunc add } } colored2D { color parm0 parm1 parm2 parm3 { shader shaders/colored2D } } colored3D { color parm0 parm1 parm2 parm3 { shader shaders/colored3D } } white2D { { shader shaders/white2D } } white3D { { shader shaders/white3D } }
1) Generic, для отрисовки простой 3D геометрии.
2) Deferred, для отрисовки геометрии в gbuffer который используется для Deferred Shading.
3) NoMip, для отрисовки 2D геометрии, gui, картинок, текста, пост эффектов, etc.
В шейдерах можно использовать таблицы с значениями
Пример применения:
color colorTable[time * 0.0005] colorTable[time * 0.0005] colorTable[time * 0.0005] 1.0 |
Шейдеры в движке на языке GLSL, в одном шейдере может быть сразу vertex, fragment, geometry шейдеры:
#vertex_shader layout(location = 0) in vec2 iPosition; #if defined(DIFFUSE_MAP) || defined(DETAIL_MAP) layout(location = 1) in vec2 iTexcoord; out vec2 vTexcoord; #if defined(TEXTURE_TRANSFORM) uniform mat4 uTextureMatrix; #endif #endif void main() { gl_Position = vec4(iPosition.xy, 0.0, 1.0); #if defined(DIFFUSE_MAP) || defined(DETAIL_MAP) #if defined(TEXTURE_TRANSFORM) vTexcoord.s = dot(vec4(iTexcoord, 0, 1), uTextureMatrix[0]); vTexcoord.t = dot(vec4(iTexcoord, 0, 1), uTextureMatrix[1]); #else vTexcoord = iTexcoord; #endif #endif } #fragment_shader layout(location = 0) out vec4 oFragmentColor0; uniform vec4 uColor; #if defined(DIFFUSE_MAP) || defined(DETAIL_MAP) in vec2 vTexcoord; #endif #if defined(DIFFUSE_MAP) uniform sampler2D uDiffuseMap; #endif #if defined(DETAIL_MAP) uniform sampler2D uDetailMap; uniform float uDetailFactor; #endif #if defined(DIFFUSE_MAP) || defined(DETAIL_MAP) vec4 GetMaterialColor() { vec4 result; #if defined(DIFFUSE_MAP) result = texture2D(uDiffuseMap, vTexcoord) * uColor; #else result = uColor; #endif #if defined(DETAIL_MAP) #if defined(DETAIL_MULTIPLY) result *= texture2D(uDetailMap, vTexcoord); #elif defined(DETAIL_ADDITIVE) result += texture2D(uDetailMap, vTexcoord) * uDetailFactor; #elif defined(DETAIL_LERP_SRC_COLOR) result = mix(result, texture2D(uDetailMap, vTexcoord), result); #elif defined(DETAIL_LERP_DST_COLOR) vec4 dstColor = texture2D(uDetailMap, vTexcoord); result = mix(result, dstColor, dstColor); #elif defined(DETAIL_LERP_SRC_ALPHA) result = mix(result, texture2D(uDetailMap, vTexcoord), result.a); #elif defined(DETAIL_LERP_DST_ALPHA) vec4 dstColor = texture2D(uDetailMap, vTexcoord); result = mix(result, dstColor, dstColor.a); #elif defined(DETAIL_LERP_FACTOR) result = mix(result, texture2D(uDetailMap, vTexcoord), uDetailFactor); #endif #endif return result; } #endif void main() { #if defined(DIFFUSE_MAP) || defined(DETAIL_MAP) oFragmentColor0 = GetMaterialColor(); #else oFragmentColor0 = uColor; #endif }
В файле шейдера можно вставлять код других шейдеров с помощью встроенной команды #import, #import shaders\utils например.
Материалы поддерживаю несколько типов маппинга, на текущий момент это:
diffuseMap, specularMap, specularLevelMap, specularExponentMap, normalMap, detailMap, ambientMap, emissionMap, environmentMap.
Возможно ещё будет heightMap если будет parallax mapping.
Можно и свои текстуры использовать с помощью команды shaderMap, shaderMap myPuperTexture, textures/myPuperTexture.tga, linear_repeat
Ссылка | Комментарии [8]
2 сен. 2011

