Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: Index Buffer / Shadow Index Buffer ... don't understand the code:

Hybrid View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Newbie Newbie
    Join Date
    Feb 2018
    Posts
    2

    Index Buffer / Shadow Index Buffer ... don't understand the code:

    I want to have shadows in my Android App (Java, not NDK), but there is no simple example Source code (in the last 8 days... I found nothing).


    Now I've found this code, but I didn't understand the "shadowIndexBuffer".

    All Objects are Boxes, and one Box is flying inside another Box and the shadows are cast to the 6 Walls inside the box.

    The "mIndexBuffer" is clear, these are the Index Numbers of the Vertex Coordinates, but what are the "shadowIndex" Buffers.


    For me it would be easier if I can find a simple demo with one plate (floor) and one textured box + shadow. But it seems that doesn't exist.

    Here is the Code:


    Code :
    		int sz = FACE_COUNT * VERTICES_PER_FACE * FLOATS_PER_VERTEX	* FLOAT_SIZE_BYTES;
     
    		ByteBuffer buffer = ByteBuffer.allocateDirect(sz);
    		mVertexBuffer = buffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
    		buffer = ByteBuffer.allocateDirect(sz);
    		mNormalBuffer = buffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
    		buffer = ByteBuffer.allocateDirect(sz);
    		mColorBuffer = buffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
     
     
    		mIndexBuffer = ByteBuffer.allocateDirect(6 * 6);
    		mIndexBuffer.position(0);
    		for (int i = 0; i < 6; ++i) {
    			mIndexBuffer.put((byte) (i * 8 + 0));
    			mIndexBuffer.put((byte) (i * 8 + 2));
    			mIndexBuffer.put((byte) (i * 8 + 4));
    			mIndexBuffer.put((byte) (i * 8 + 2));
    			mIndexBuffer.put((byte) (i * 8 + 6));
    			mIndexBuffer.put((byte) (i * 8 + 4));
    		}
     
     
    	mShadowIndexBuffer = ByteBuffer.allocateDirect(6 * 6 * 6);
    		mShadowIndexBuffer.position(0);
    		for (int i = 0; i < 6; ++i) {
     
    			mShadowIndexBuffer.put((byte) (i * 8 + 0));
    			mShadowIndexBuffer.put((byte) (i * 8 + 1));
    			mShadowIndexBuffer.put((byte) (i * 8 + 2));
    			mShadowIndexBuffer.put((byte) (i * 8 + 1));
    			mShadowIndexBuffer.put((byte) (i * 8 + 3));
    			mShadowIndexBuffer.put((byte) (i * 8 + 2));
     
    			mShadowIndexBuffer.put((byte) (i * 8 + 2));
    			mShadowIndexBuffer.put((byte) (i * 8 + 3));
    			mShadowIndexBuffer.put((byte) (i * 8 + 6));
    			mShadowIndexBuffer.put((byte) (i * 8 + 3));
    			mShadowIndexBuffer.put((byte) (i * 8 + 7));
    			mShadowIndexBuffer.put((byte) (i * 8 + 6));
     
    			mShadowIndexBuffer.put((byte) (i * 8 + 6));
    			mShadowIndexBuffer.put((byte) (i * 8 + 7));
    			mShadowIndexBuffer.put((byte) (i * 8 + 4));
    			mShadowIndexBuffer.put((byte) (i * 8 + 7));
    			mShadowIndexBuffer.put((byte) (i * 8 + 5));
    			mShadowIndexBuffer.put((byte) (i * 8 + 4));
     
    			mShadowIndexBuffer.put((byte) (i * 8 + 4));
    			mShadowIndexBuffer.put((byte) (i * 8 + 5));
    			mShadowIndexBuffer.put((byte) (i * 8 + 0));
    			mShadowIndexBuffer.put((byte) (i * 8 + 5));
    			mShadowIndexBuffer.put((byte) (i * 8 + 1));
    			mShadowIndexBuffer.put((byte) (i * 8 + 0));
    		}
     
    		setNormal(0, 0f, 0f, 1f);
    		setNormal(1, 0f, 0f, -1f);
    		setNormal(2, 0f, 1f, 0f);
    		setNormal(3, 0f, -1f, 0f);
    		setNormal(4, 1f, 0f, 0f);
    		setNormal(5, -1f, 0f, 0f);
     
    		setSize(1f, 1f, 1f);
    		setColor(.5f, .5f, .5f);
     
     
     
    @Override
    	public void render(GlslShaderIds ids) {
    		super.render(ids);
     
    		int stride = FLOATS_PER_VERTEX * FLOAT_SIZE_BYTES;
    		mVertexBuffer.position(0);
    		GLES20.glVertexAttribPointer(ids.aPosition, 3, GLES20.GL_FLOAT, false, stride, mVertexBuffer);
    		GLES20.glEnableVertexAttribArray(ids.aPosition);
     
    		mNormalBuffer.position(0);
    		GLES20.glVertexAttribPointer(ids.aNormal, 3, GLES20.GL_FLOAT, false,	stride, mNormalBuffer);
    		GLES20.glEnableVertexAttribArray(ids.aNormal);
     
    		mColorBuffer.position(0);
    		GLES20.glVertexAttribPointer(ids.aColor, 3, GLES20.GL_FLOAT, false,	stride, mColorBuffer);
    		GLES20.glEnableVertexAttribArray(ids.aColor);
     
    		GLES20.glUniformMatrix4fv(ids.uModelViewM, 1, false, getModelViewM(), 0);
    		GLES20.glUniformMatrix4fv(ids.uModelViewProjM, 1, false,	getModelViewProjM(), 0);
    		GLES20.glUniformMatrix4fv(ids.uNormalM, 1, false, getNormalM(), 0);
     
    		mIndexBuffer.position(0);
    		GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6 * 6,GLES20.GL_UNSIGNED_BYTE, mIndexBuffer);
    	}
     
    	@Override
    	public void renderShadow(GlslShaderIds ids) {
    		super.renderShadow(ids);
     
    		int stride = FLOATS_PER_VERTEX * FLOAT_SIZE_BYTES;
    		mVertexBuffer.position(0);
    		GLES20.glVertexAttribPointer(ids.aPosition, 3, GLES20.GL_FLOAT, false,stride, mVertexBuffer);
    		GLES20.glEnableVertexAttribArray(ids.aPosition);
     
    		mNormalBuffer.position(0);
    		GLES20.glVertexAttribPointer(ids.aNormal, 3, GLES20.GL_FLOAT, false,	stride, mNormalBuffer);
    		GLES20.glEnableVertexAttribArray(ids.aNormal);
     
     
    		GLES20.glUniformMatrix4fv(ids.uModelViewM, 1, false, getModelViewM(), 0);
    		GLES20.glUniformMatrix4fv(ids.uModelViewProjM, 1, false,	getModelViewProjM(), 0);
    		GLES20.glUniformMatrix4fv(ids.uNormalM, 1, false, getNormalM(), 0);
     
    		mShadowIndexBuffer.position(0);
    		GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6 * 4 * 6,GLES20.GL_UNSIGNED_BYTE, mShadowIndexBuffer);
    	}

  2. #2
    Newbie Newbie
    Join Date
    Feb 2018
    Posts
    2
    Ok, I've read that these are "Box" Shadows... useless for not "Boxed" objects, and also complicated.

    I#m using another Shadow, this is working fine.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •