Энэ постоор бид MaterialState, TextureState, LightState, PointLight классуудын хэрэглээг үзнэ.
import java.net.URL;
import com.jme.app.SimpleGame;
import com.jme.bounding.BoundingBox;
import com.jme.bounding.BoundingSphere;
import com.jme.image.Texture;
import com.jme.light.PointLight;
import com.jme.math.Vector3f;
import com.jme.renderer.ColorRGBA;
import com.jme.scene.Node;
import com.jme.scene.shape.Box;
import com.jme.scene.shape.Sphere;
import com.jme.scene.state.LightState;
import com.jme.scene.state.MaterialState;
import com.jme.scene.state.TextureState;
import com.jme.util.TextureManager;
public class HelloStates extends SimpleGame {
public static void main(String[] args) {
HelloStates app = new HelloStates();
app.setConfigShowMode(ConfigShowMode.AlwaysShow);
app.start();
}
protected void simpleInitGame() {
// Объектүүдээ эхлэн үүсгэх. Ямар нэгэн шинэ зүйл алга.
Box b=new Box("my box",new Vector3f(1,1,1),new Vector3f(2,2,2));
b.setModelBound(new BoundingBox());
b.updateModelBound();
Sphere s=new Sphere("My sphere",15,15,1);
s.setModelBound(new BoundingSphere());
s.updateModelBound();
Node n=new Node("My root node");
// Ачаалах текстур зургийн байгаа байрлалыг заасан URL хаягийг авах
URL monkeyLoc;
monkeyLoc=HelloStates.class.getClassLoader()
.getResource("jmetest/data/images/Monkey.jpg");
// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();
// TextureManager-ийг хэрэглэн текстурыг санах ойд ачаалах
Texture t=TextureManager.loadTexture(
monkeyLoc,
Texture.MinificationFilter.BilinearNearestMipMap,
Texture.MagnificationFilter.Bilinear);
// TextureState-д текстур зургаа даалгах
ts.setTexture(t);
// MaterialState-ийг авах
MaterialState ms=display.getRenderer().createMaterialState();
// MaterialState-д цацруулсан өнгө өгөх
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));
// Цэгэн гэрлийг үүсгэх
PointLight l=new PointLight();
// Цэгэн гэрэлд байрлал өгөх
l.setLocation(new Vector3f(0,10,5));
// Улаан гэрэл өгөх
l.setDiffuse(ColorRGBA.red.clone());
// Гэрэлтүүлэх
l.setEnabled(true);
// Гэрлээ дотор нь байруулахад зориулж LightState-ийг үүсгэх
LightState ls=display.getRenderer().createLightState();
// Гэрлийг хавсаргах
ls.attach(l);
// b-д renderstate ts-ийг мэдээлэх
b.setRenderState(ts);
// n нь renderstate ms-ийг хэрэглэх хэрэгтэй
n.setRenderState(ms);
// SimpleGame-аар хийгдсэн бүх хуучин гэрэлнүүдийг модноос салгах
lightState.detachAll();
// n зангилааны доор гэрлийн эффектийг өгөх
n.setRenderState(ls);
// b болон s -ийг n зангилаарүү хавсаргаад n-ийгээ rootNode-лүү хавсаргах
n.attachChild(b);
n.attachChild(s);
rootNode.attachChild(n);
}
}
[Програм маань ажилласан үр дүн]

Шинэ зүйлээс эхлэн кодыг тайлбарлъя. Эхний код маань Сармагчны зургийг тодорхойлон зааж өгч байна.
// Ачаалах текстур зургийн байгаа байрлалыг заасан URL хаягийг авах
URL monkeyLoc;
monkeyLoc=HelloStates.class.getClassLoader()
.getResource("jmetest/data/images/Monkey.jpg");
бид энэ Monkey.jpg зургийг куб объект дээр наан хэрэгллэх юм. Үүний тулд бидэнд TextureState объект хэрэг болно.
// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();
Энд бидний хувьд шинэ зүйл гарч ирж байна. Дээрхи display объект нь SimpleGame класс дотор бичигдсэн байгаа. Рэндэрлэх үүрэгтэй объектийг нь авч байгаад түүнээсээ texturestate-ийг үүсгэн авч байна. Манай жишээ нь LWJGL-ийг хэрэглэж байгаа тул дээрхи байдалтай кодоор хийгдэж байна. Харин бид JOGL рэндэрлэгч санг хэрэглэж байгаа тохиолдолд TextureState маань JOGL-той харьцана. Энэ хоёр рэндэрлэгч орчноос хамааралгүй код бичихийг хүсвэл та дараах байдалтайгаар код бичих боломжтой.
// TextureState-ийг авах
TextureState ts=
DisplaySystem.getDisplaySystem.getRenderer().createTextureState();
SimpleGame дотор DisplaySystem.getDisplaySystem() ижилхэн чанартай байдаг. Бид одоо текстур төлөвтэй боллоо. Үүнийгээ Текстурлүү хавсаргая.
// TextureManager-ийг хэрэглэн текстурыг санах ойд ачаалах
Texture t=TextureManager.loadTexture(
monkeyLoc,
Texture.MinificationFilter.BilinearNearestMipMap,
Texture.MagnificationFilter.Bilinear);
Үүний тулд бид TextureManager-ийг хэрэглэнэ. Энэ класс нь URL-аар тодорхойлогдон санах ойд ачаалагдсан текстур зургуудыг зохицуулахад хэрэглэгддэг. MM_LINEAR болон FM_LINEAR утгууд нь текстурд ямар байдлаар шүүлтүүр хийхийг тодорхойлдог. Хамгийн сүүлийн true утга нь mipmap төлөв юм.
Texture State: Объектийн гадаргуу
Текстур зургийг объект бүрэхийн тулд бидэн TextureState класс хэрэг болно. Энэ классыг DisplaySystem-ээр үүсгэдэг.
// TextureState-ийг авах
TextureState ts=display.getRenderer().createTextureState();
Манай TextureState өмнө үүсгэсэн Texture объектийг хүлээн авахад бэлэн болсон
// Assign the texture to the TextureState
ts.setTexture(t);
TextureState нь өгөгдсөн зангилаа болон түүний хүү зангилаануудад зориулагдсан текстуруудын төлөвийг хариуцдаг. Нэг хоромд хариуцагддаг TextureState-ийн төлөвүүдийн тоо нь GPU дээрхи текстур байгууламжуудын тоотой тэнцүү.
MaterialState: Объектийн өнгө
Объект өнгө онооход бидэн MaterialState класс хэрэгтэй. мөн л DisplaySystem-ээр үүсгэгддэг.
// MaterialState-ийг авах
MaterialState ms=display.getRenderer().createMaterialState();
Зиа бид одоо MaterialState-тай болж авлаа тэгвэл үүнд өнгө өгөх хэрэгтэй:
// MaterialState-д өнгөний ялгаралуулалтыг өгөх
ms.setEmissive(new ColorRGBA(0f,.2f,0f,1));
The Emissive Color(Ялгаруулалттай өнгө) нь объектийг жаахан ногоон байдалтай харагдуулна. Доороосоо яагаад жаахан ногоон байгаа учир нь энэ. Материал нь объектийн өнгөний ялгаруулалтын чанар, орчны өнгө, өнгөний сариналт, тусгалын өнгө зэргээр тодорхойлогддог. Мөн материал нь объектийн цацаргалт объектийн альфа утга зэргээр тодорхойлогддог. Тэхээр MaterialState-д setEmissive, setSpecular, setDiffuse, setAmbient, setShininess. гэх зэрэг функцүүд байдаг.
MaterialStates болон per-vertex өнгө олголт хоёрын ялгаа нь MaterialState нь гэрэлтүүлэг сүүдэрлэлтийг хэрэглэдэгт байдаг. Энэ нь илүү дээр харагддаг гэсэн үг юм.
LightState
MaterialState болон TextureState хоёрын үзэгдэх байдал нь гэрлийн эх үүсвэрээс хамааралтай. Гэрлийн эх үүсвэрийг гэрлийг хариуцдаг LightState классаар хийдэг.
// Цэгэн гэрлийг үүсгэх
PointLight l=new PointLight();
// Байрлалыг нь оноох
l.setLocation(new Vector3f(0,10,5));
Дээрхи код нь цэгэн гэрлийн объектийг үүсгэж байна. PointLight-ийг чийдэнтэй зүйрлээрэй. Гэрэлд өөрийн гэсэн өнгө байж болдог тэхээр үүнд улаан өнгө өгье:
// Улаан өнгө өгье
l.setDiffuse(ColorRGBA.red.clone());
PointLight объектийг үүсгэсний дараа LightState-ийг гэрэлрүү хавсаргаж өгөх хэрэгтэй. LightState нь MaterialState-ийн өнгийг харагдах боломжийг олгоно. LightState нь мөн л DisplaySystem-ээр үүсгэгддэг.
// дотор нь гэрлээ тавихын тулд LightState-ийг үүсгэе
LightState ls=display.getRenderer().createLightState();
// Гэрлийг хавсаргах
ls.attach(l);
Объектийн төлөвүүдэд хандах
Бүх төлөвүүдээ үүсгэсний дараагаар тэдгээрийг өөрчлөхийг хүссэн зангилаандаа шилжүүлж өгье. n зангилаа нь b хайрцаг болон s бөмбөрцөгийн эцэг зангилаа юм. n зангилааны бүх хүү зангилаануудыг ms-ийн тусламжтайгаар ногоондуу өнгөтэй болгож байна. ls улаавтар гэрлийг n зангилаан дээр тусгаж өглөө. мөн сармагчны зурган текстурыг болох ts-ийг хайрцаган дээр тохируулъя.
// SimpleGame-д өмнө тохируулагдсан байсан бүх гэрлүүдийг усгах
lightState.detachAll();
// n зангилааны доорхи бүгдэд гэрэл өгөх
n.setRenderState(ls);
// ''n'' зангилаа нь ''ms'' ийг хэрэглэнэ гэдгийг илэрхийлнэ
n.setRenderState(ms);
// ''b'' хайрцаг ''ts''-ийг хэрэглэнэ
b.setRenderState(ts);