blender3d.org -- GLSL Pixel and Vertex shaders
Blender に、OpenGL SL(シェーダランゲージ)のピクセル/バーテックスシェーダを Game Engine 用に割り当てることができるようになりました。もっとちゃんとしたドキュメントは Game Engine Documentation にあります。
シェーダは Python の使用により、単一の Material に適用できます。Object 上のそれぞれの Material ごとに、一つのシェーダに(その Material から)アクセスできます。少しの例外を除き、ほとんどの GLSL の関数にアクセスできます。Attribute の位置は利用できません。
実際には、下記のような宣言は動作しません。
フラグメントシェーダでは、下記の Sampler のみ使用可能です。
sampler2D はImage タイプを参照し、samplerCube は Envmap を参照します。
プログラム中で uniform 変数にアクセスするには、その変数の名前/値を補う必要があります:shader.setUniform[if][v](name,value)
vec3 の場合、
あるいは
Sampler は取扱いに少し違いがあり、インデックスによりアクセスされます(0,2など)。このインデックスは Material パネル内で供給される Texture の順序を参照しています。もし Material がなければ、0を有効な Sampler のインデックスとして常に使用できます。
テンプレート
もしエラーが起こった場合、material.getShader()関数は None を返し、その Matarial 用のシェーダは使用されなくなります。
Last update: Jan 26 2006.
This section is maintained by Ton Roosendaal.
GLSL ピクセル/バーテックスシェーダ
Blender に、OpenGL SL(シェーダランゲージ)のピクセル/バーテックスシェーダを Game Engine 用に割り当てることができるようになりました。もっとちゃんとしたドキュメントは Game Engine Documentation にあります。
シェーダは Python の使用により、単一の Material に適用できます。Object 上のそれぞれの Material ごとに、一つのシェーダに(その Material から)アクセスできます。少しの例外を除き、ほとんどの GLSL の関数にアクセスできます。Attribute の位置は利用できません。
実際には、下記のような宣言は動作しません。
//--
attribute vec3 variable;
//--
フラグメントシェーダでは、下記の Sampler のみ使用可能です。
// --
uniform sampler2D;
uniform samplerCube;
//--
sampler2D はImage タイプを参照し、samplerCube は Envmap を参照します。
プログラム中で uniform 変数にアクセスするには、その変数の名前/値を補う必要があります:shader.setUniform[if][v](name,value)
vec3 の場合、
shader.setUniform3f(name,f,f,f)
shader.setUniformfv(name, [f,f,f] )
Sampler は取扱いに少し違いがあり、インデックスによりアクセスされます(0,2など)。このインデックスは Material パネル内で供給される Texture の順序を参照しています。もし Material がなければ、0を有効な Sampler のインデックスとして常に使用できます。
shader.setSampler(sampler_name, texture_index)
テンプレート
#------------------------------------------------------------------------------
import GameLogic
objects = GameLogic.getCurrentScene().getObjectList()
# -------------------------------------
ShaderObjects = [] # add objects
MaterialIndexList = [0] # material index
# -------------------------------------
VertexShader = """
void main(){
gl_Position = ftransform();
}
"""
FragmentShader = """
void main(){
gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0);
}
"""
def MainLoop ():
for obj in ShaderObjects:
mesh_index = 0
mesh = obj.getMesh(mesh_index)
while mesh != None:
for mat in mesh.materials:
if not hasattr(mat, "getMaterialIndex"):
return
mat_index = mat.getMaterialIndex()
found = 0
for i in range(len(MaterialIndexList)):
if mat_index == MaterialIndexList[i]:
found=1
break
if not found: continue
shader = mat.getShader()
if shader != None:
if not shader.isValid():
shader.setSource(VertexShader, FragmentShader,1)
# set shader variables
# --
mesh_index += 1
mesh = obj.getMesh(mesh_index)
# -------------------------------------
MainLoop()
#------------------------------------------------------------------------------
Last update: Jan 26 2006.
This section is maintained by Ton Roosendaal.
投票数:36
平均点:10.00
Blender2.41 スクリーン分割とマルチビュー |
Blender機能別 |
Blender2.41 Blender Material |
ログイン
クイックリンク
2021/07/01版
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki
●Blender.org
BlenderFoundation
- Blenderのダウンロード
- 公式チュート等
- 公式マニュアル(和訳)
●ニュース(英文)
BlenderNation
●Blenderコミュニティ
blenderartists.org
●Blender Q&A
- Blender Stack Exchange
●テストビルド
Buildbot(自動生成)
●開発関連
公式開発サイト
Blender開発blog
Blender Wiki