0

OpenGlで電光石火を作りたいです。そのために、私はこの関数を書きました:

public Blitz()
{
    points = new float[STEPS * 3];

    for(int i = 0; i < STEPS; i += 3)
    {
        points[i]     = (float) (startX + i * (endX - startX) / STEPS);
        points[i + 1] = (float) (startY + i * (endY - startY) / STEPS);
        points[i + 2] = 0;
    }

    // ...
    vertexBuffer.put(points);
    vertexBuffer.position(0);

}

public void update()
{
    for(int i = 0; i < STEPS; i += 3)
    {
        float rnd = random(); // creates rnd float

        if(points[i] + rnd < startX + 5 && points[i] + rnd > startX - 5)
        {
            points[i] += rnd;
        }
    }

    vertexBuffer.clear();
    vertexBuffer.put(points);
    vertexBuffer.position(0);
}

public void render()
{
    texture.bind();

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glLineWidth(10);
    gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, STEPS);
}

テクスチャに使用するテクスチャ クラスは次のとおりです。

public class Texture 
{
    private GL10 gl;

    FloatBuffer texCoords;
    private int textureID;

    public Texture(GL10 gl, Bitmap bmp)
    {   
        this.gl = gl;

        int[] TextureIDs = new int[1];
        gl.glGenTextures(1, TextureIDs, 0);     
        textureID = TextureIDs[0];

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bmp, 0);

        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);

        ByteBuffer buffer = ByteBuffer.allocateDirect( 4 * 2 * 4 );
        buffer.order(ByteOrder.nativeOrder());
        texCoords = buffer.asFloatBuffer(); 
        texCoords.put(0);
        texCoords.put(0);

        texCoords.put(0);
        texCoords.put(1);

        texCoords.put(1);
        texCoords.put(1);

        texCoords.put(1);
        texCoords.put(0);       
        texCoords.rewind();
    }

    public void bind()
    {   
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_SRC_ALPHA);

        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texCoords);
    }

    public void dispose()
    {
        int[] textures = {textureID};
        gl.glDeleteTextures(1, textures, 0);
        textureID = 0;              
    }
}

通常の色ではすべてうまく機能しますが、このテクスチャを線に配置したい場合は、次の結果になります。

電気テクスチャ 結果

理由はありますか?私の間違いは何ですか?

4

1 に答える 1

2

あなたの間違いは、OpenGL ラインが、ラインの方向に対して垂直に変化する 1 つの座標を持つテクスチャを描画できると仮定したことです。テクスチャ座標は頂点属性であり、線分には頂点が 2 つしかないため、OpenGL では単純にそれができません。つまり、テクスチャ座標の変化は線に沿ってのみ可能であり、垂直ではありません。

解決策は、線を描くのではなく、頂点が線の両側に押し出された四角形または三角形のストリップを描くことです。これは、スクリーン パラレル スペースで動作するシェーダーを使用して最も簡単に実行できます。

于 2013-10-10T00:10:00.373 に答える