0

3Dシーンを作成しようとしています。雲のある織り目加工の地球があります。透明な球体とその上の雲のテクスチャで雲を作成できると思います(間違っていたら訂正してください)。だから私は以下のいくつかのコードを持っています:

ShaderProgram shader;
Mesh mesh, cloudMesh;
Texture texture, cloudTexture;
Matrix4 matrix = new Matrix4();

 public void create() {
String vertexShader = "attribute vec4 a_position;    \n"
    + "attribute vec4 a_color;\n" 
    + "attribute vec2 a_texCoords;\n"
    + "uniform mat4 u_worldView;\n" 
    + "varying vec4 v_color;"
    + "varying vec2 v_texCoords;"
    + "void main()                  \n"
    + "{                            \n"
    + "   v_color = vec4(1, 1, 1, 1); \n"
    + "   v_texCoords = a_texCoords; \n"
    + "   gl_Position =  u_worldView * a_position;  \n"
    + "}                            \n";
String fragmentShader = "#ifdef GL_ES\n"
    + "precision mediump float;\n"
    + "#endif\n"
    + "varying vec4 v_color;\n"
    + "varying vec2 v_texCoords;\n"
    + "uniform sampler2D u_texture;\n"
    + "void main()                                  \n"
    + "{                                            \n"      
     + "  gl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n"
    + "}";

shader = new ShaderProgram(vertexShader, fragmentShader);
if (shader.isCompiled() == false) {     
  System.exit(0);
}

mesh = ObjLoader.loadObj(Gdx.files.internal("objects/earth.obj").read()); 
cloudMesh = ObjLoader.loadObj(Gdx.files.internal("objects/cloud_sphere.obj").read()); 
texture = new Texture(Gdx.files.internal("images/earthmap.jpg"));
cloudTexture = new Texture(Gdx.files.internal("images/earth_clouds_map.jpg"));
}

public void render() {
angle += Gdx.graphics.getDeltaTime() * 30;
matrix.setToRotation(axis, angle);

Gdx.graphics.getGL20().glViewport(-10, 10, Gdx.graphics.getWidth(),
    Gdx.graphics.getHeight());

Gdx.graphics.getGL20().glClearColor(0.2f, 0.2f, 0.2f, 1);
Gdx.graphics.getGL20().glClear(GL20.GL_COLOR_BUFFER_BIT);
Gdx.graphics.getGL20().glEnable(GL20.GL_TEXTURE_2D);
Gdx.graphics.getGL20().glEnable(GL20.GL_BLEND);
Gdx.graphics.getGL20().glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
texture.bind();
shader.begin();
shader.setUniformMatrix("u_worldView", matrix);
shader.setUniformi("u_texture", 0);
mesh.render(shader, GL20.GL_TRIANGLE_STRIP);
shader.end();    
//SHOULD I USE SHADER PROGRAM LIKE BELOW?
cloudTexture .bind();
shader.begin();
shader.setUniformMatrix("u_worldView", matrix);
shader.setUniformi("u_texture", 0);
cloudMesh.render(shader, GL20.GL_TRIANGLE_STRIP);
shader.end();  
}    

そのため、球体にテクスチャが表示されません。どこが間違い?誰かがアイデア、リンク、または例を持っていれば、それは大歓迎です!

4

1 に答える 1

3

テクスチャをロードする前に、テクスチャを保存する「スロット」を定義する必要があります。

Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
texture = new Texture(Gdx.files.internal("images/earthmap.jpg"));
texture.bind();

Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE1);
cloudTexture = new Texture(Gdx.files.internal("images/earth_clouds_map.jpg"));
cloudTexture.bind();

次に、レンダー メソッドでテクスチャをバインドし、これらの「スロット」を使用してシェーダーに割り当てます。

shader.setUniformi("u_texture", 0);
...
...
shader.setUniformi("u_texture", 1);

それがすべてのはずです...

于 2012-12-28T16:38:46.433 に答える