<< jrManのクラスをコンパイル 戻る jrManでblend shaderをつくる その2 >>

jrManでblend shaderをつくる

RSLシェーディング言語だと、
green=color "rgb" (0,1,0);
Ct=(1-s)*Cs+s*green;

どうやるのか、コンパイルするとエラー!!
SurfaceBlend.java:84: シンボルを見つけられません。
シンボル: メソッド add(float,org.jrman.grid.Color3fGrid)
場所 : org.jrman.grid.Color3fGrid の クラス
ct1.add(1.0f,ct1);
^
エラー 1 個

なので、ct1.sub(specularcolor,ct1);としたら、コンパイルした。color型なのですね。

blend.jpg

以下、クラスファイルのソース

/*
SurfaceBlend.java
*/

import javax.vecmath.Color3f;

import org.jrman.grid.Color3fGrid;
import org.jrman.grid.Vector3fGrid;
import org.jrman.parameters.Declaration;
import org.jrman.parameters.UniformScalarFloat;
import org.jrman.parameters.UniformScalarTuple3f;
import org.jrman.render.ShaderVariables;
import org.jrman.shaders.SurfaceShader;

public class SurfaceBlend extends SurfaceShader {

private static Vector3fGrid vg1 = new Vector3fGrid();

private static Vector3fGrid vg2 = new Vector3fGrid();

private static Color3fGrid cg1 = new Color3fGrid();

private static Color3fGrid cg2 = new Color3fGrid();

private static Color3fGrid cg3 = new Color3fGrid();

private static Color3fGrid ct1 = new Color3fGrid();

private static Color3f specularcolor = new Color3f();

private static Color3f color1 = new Color3f();

protected void initDefaults() {
defaultParameters.addParameter(
new UniformScalarFloat(new Declaration("Ka", "uniform float"), 1f));
defaultParameters.addParameter(
new UniformScalarFloat(new Declaration("Kd", "uniform float"), .5f));
defaultParameters.addParameter(
new UniformScalarFloat(new Declaration("Ks", "uniform float"), .5f));
defaultParameters.addParameter(
new UniformScalarFloat(new Declaration("roughness", "uniform float"), .1f));
defaultParameters.addParameter(
new UniformScalarTuple3f(
new Declaration("specularcolor", "uniform color"),
1f,
1f,
1f));
defaultParameters.addParameter(
new UniformScalarTuple3f(
new Declaration("color1", "uniform color"),
0f,
1f,
0f));
}

public void shade(ShaderVariables sv) {
super.shade(sv);
UniformScalarFloat paramKa = (UniformScalarFloat) getParameter(sv, "Ka");
final float Ka = paramKa.getValue();
UniformScalarFloat paramKd = (UniformScalarFloat) getParameter(sv, "Kd");
final float Kd = paramKd.getValue();
UniformScalarFloat paramKs = (UniformScalarFloat) getParameter(sv, "Ks");
final float Ks = paramKs.getValue();
UniformScalarFloat paramRoughness = (UniformScalarFloat) getParameter(sv, "roughness");
final float roughness = paramRoughness.getValue();
UniformScalarTuple3f paramSpecularcolor =
(UniformScalarTuple3f) getParameter(sv, "specularcolor");
paramSpecularcolor.getValue(specularcolor);
UniformScalarTuple3f paramColor1 =
(UniformScalarTuple3f) getParameter(sv, "color1");
paramColor1.getValue(color1);

vg1.normalize(sv.N);
vg1.faceforward(vg1, sv.I);
vg2.normalize(sv.I);
vg2.negate(vg2);

ct1.set(sv.s);

cg3.set(color1);
cg3.mul(ct1,cg3);

ct1.sub(specularcolor,ct1);

ct1.mul(ct1,sv.Cs);
ct1.add(ct1,cg3);

sv.Oi.set(sv.Os);
ambient(sv, cg1);
cg3.set(Ka);
cg1.mul(cg1, cg3);
diffuse(sv, vg1, cg2);
cg3.set(Kd);
cg2.mul(cg2, cg3);
cg1.add(cg1, cg2);
specular(sv, vg1, vg2, roughness, cg2);
cg3.set(Ks);
cg2.mul(cg2, cg3);
cg3.set(specularcolor);
cg2.mul(cg2, cg3);
cg1.add(cg1, cg2);
cg1.mul(cg1, ct1);
sv.Ci.mul(sv.Os, cg1);
}

}


カラー変更できるようにしておいたので、良いですね。

Display "blendtest.tif" "framebuffer" "rgb"
Format 640 480 1
Projection "perspective" "fov" [45]
LightSource "ambientlight" 1 "intensity" [0.2]
LightSource "spotlight" 2 "from" [-1 1 0 ] "to" [0 0 3] "intensity" [10]
Translate 0 0 3
WorldBegin
Color [1 0 0]
Surface "blend" "color color1" [0.2 0.4 0.6]
Rotate 10 1 0 0
#Rotate 180 1 0 0
#Patch "bilinear" "P" [-1 -1 0 1 -1 0 -1 1 0 1 1 0]
Sphere 1 -1 1 360
WorldEnd

blend2.jpg
引き続き、実験君です。
jrManはレンダーマンの勉強になります。
javaについて学ぶ機会になっているかも・・・

ありがとうございます。
Thanks Gerardo.
  • -
  • -

<< jrManのクラスをコンパイル 戻る jrManでblend shaderをつくる その2 >>