浏览代码

Cubemap as texture array OpenGL support + example

benoitjacquier 9 年之前
父节点
当前提交
b19ca48387

+ 32 - 0
examples/08-update/cs_update.sc

@@ -0,0 +1,32 @@
+/*
+ * Copyright 2014 Stanlo Slasinski. All rights reserved.
+ * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
+ */
+
+#include "bgfx_compute.sh"
+
+IMAGE2D_ARRAY_WR(s_texColor,rgba32f,0);
+uniform vec4 u_time;
+
+NUM_THREADS(16, 16, 1)
+void main()
+{
+	vec3 colors[] = {
+		vec3(1,0,0),
+		vec3(1,1,0),
+		vec3(1,0,1),
+		vec3(0,1,0),
+		vec3(0,1,1),
+		vec3(0,0,1),
+	};
+
+	for (int face=0;face<6;face++)
+	{
+		vec3 color = colors[face]*0.75 + sin( u_time.x*4.0 )*0.25;
+		ivec3 dest = ivec3( gl_GlobalInvocationID.xy, face );
+		imageStore( s_texColor, dest, vec4(color,1) );
+	}
+}
+
+
+

+ 62 - 19
examples/08-update/update.cpp

@@ -162,7 +162,8 @@ public:
 		const bgfx::Caps* caps = bgfx::getCaps();
 		m_texture3DSupported = !!(caps->supported & BGFX_CAPS_TEXTURE_3D);
 		m_blitSupported      = !!(caps->supported & BGFX_CAPS_TEXTURE_BLIT);
-		m_numm_textures3d      = 0;
+		m_computeSupported   = !!(caps->supported & BGFX_CAPS_COMPUTE);
+		m_numm_textures3d    = 0;
 
 		if (m_texture3DSupported)
 		{
@@ -215,6 +216,12 @@ public:
 			m_program3d = loadProgram("vs_update", "fs_update_3d");
 		}
 
+		m_programCompute.idx = bgfx::invalidHandle;
+		if (m_computeSupported)
+		{
+			m_programCompute = bgfx::createProgram( loadShader( "cs_update" ), true );
+		}
+
 		// Create texture sampler uniforms.
 		s_texCube  = bgfx::createUniform("s_texCube",  bgfx::UniformType::Int1);
 		s_texColor = bgfx::createUniform("s_texColor", bgfx::UniformType::Int1);
@@ -222,6 +229,11 @@ public:
 		// Create time uniform.
 		u_time = bgfx::createUniform("u_time", bgfx::UniformType::Vec4);
 
+		for(uint32_t ii = 0; ii<BX_COUNTOF( m_textureCube ); ++ii)
+		{
+			m_textureCube[ii].idx = bgfx::invalidHandle;
+		}
+
 		m_textureCube[0] = bgfx::createTextureCube(
 				  textureside
 				, false
@@ -241,6 +253,17 @@ public:
 					);
 		}
 
+		if (m_computeSupported) 
+		{
+			m_textureCube[2] = bgfx::createTextureCube(
+				textureside
+				, false
+				, 1
+				, bgfx::TextureFormat::RGBA8
+				, BGFX_TEXTURE_COMPUTE_WRITE
+				);
+		}
+
 		m_texture2d = bgfx::createTexture2D(
 				  texture2dSize
 				, texture2dSize
@@ -284,11 +307,15 @@ public:
 		}
 
 		bgfx::destroyTexture(m_texture2d);
-		bgfx::destroyTexture(m_textureCube[0]);
-		if (m_blitSupported)
+
+		for (uint32_t ii = 0; ii<BX_COUNTOF(m_textureCube); ++ii)
 		{
-			bgfx::destroyTexture(m_textureCube[1]);
+			if (bgfx::isValid(m_textureCube[ii]))
+			{
+				bgfx::destroyTexture(m_textureCube[ii]);
+			}
 		}
+
 		bgfx::destroyIndexBuffer(m_ibh);
 		bgfx::destroyVertexBuffer(m_vbh);
 		if (bgfx::isValid(m_program3d) )
@@ -296,6 +323,10 @@ public:
 			bgfx::destroyProgram(m_program3d);
 		}
 		bgfx::destroyProgram(m_programCmp);
+		if (bgfx::isValid(m_programCompute) )
+		{
+			bgfx::destroyProgram(m_programCompute);
+		}
 		bgfx::destroyProgram(m_program);
 		bgfx::destroyUniform(u_time);
 		bgfx::destroyUniform(s_texColor);
@@ -426,26 +457,36 @@ public:
 			// Set view and projection matrix for view 0.
 			bgfx::setViewTransform(0, view, proj);
 
-			for (uint32_t ii = 0; ii < 1 + uint32_t(m_blitSupported); ++ii)
+			// Update texturecube using compute shader
+			if (m_computeSupported )
 			{
-				float mtx[16];
-				bx::mtxSRT(mtx, 1.0f, 1.0f, 1.0f, time, time*0.37f, 0.0f, -1.5f*m_blitSupported + ii*3.0f, 0.0f, 0.0f);
+				bgfx::setImage( 0, s_texCube, m_textureCube[2], 0, bgfx::Access::Write );
+				bgfx::dispatch( 0, m_programCompute, textureside/16, textureside/16 );
+			}
 
-				// Set model matrix for rendering.
-				bgfx::setTransform(mtx);
+			for (uint32_t ii = 0; ii < BX_COUNTOF(m_textureCube); ++ii)
+			{
+				if (bgfx::isValid(m_textureCube[ii])) 
+				{
+					float mtx[16];
+					bx::mtxSRT( mtx, 0.7f, 0.7f, 0.7f, time, time*0.37f, 0.0f, -2.0f +ii*2.0f, 0.0f, 0.0f );
 
-				// Set vertex and index buffer.
-				bgfx::setVertexBuffer(m_vbh);
-				bgfx::setIndexBuffer(m_ibh);
+					// Set model matrix for rendering.
+					bgfx::setTransform( mtx );
 
-				// Bind texture.
-				bgfx::setTexture(0, s_texCube, m_textureCube[ii]);
+					// Set vertex and index buffer.
+					bgfx::setVertexBuffer( m_vbh );
+					bgfx::setIndexBuffer( m_ibh );
 
-				// Set render states.
-				bgfx::setState(BGFX_STATE_DEFAULT);
+					// Bind texture.
+					bgfx::setTexture( 0, s_texCube, m_textureCube[ii] );
+
+					// Set render states.
+					bgfx::setState( BGFX_STATE_DEFAULT );
 
-				// Submit primitive for rendering to view 0.
-				bgfx::submit(0, m_program);
+					// Submit primitive for rendering to view 0.
+					bgfx::submit( 0, m_program );
+				}
 			}
 
 			// Set view and projection matrix for view 1.
@@ -557,6 +598,7 @@ public:
 	uint32_t m_numm_textures3d;
 	bool m_texture3DSupported;
 	bool m_blitSupported;
+	bool m_computeSupported;
 
 	std::list<PackCube> m_quads;
 	RectPackCubeT<256> m_cube;
@@ -573,11 +615,12 @@ public:
 	bgfx::TextureHandle m_textures[9];
 	bgfx::TextureHandle m_textures3d[3];
 	bgfx::TextureHandle m_texture2d;
-	bgfx::TextureHandle m_textureCube[2];
+	bgfx::TextureHandle m_textureCube[3];
 	bgfx::IndexBufferHandle m_ibh;
 	bgfx::VertexBufferHandle m_vbh;
 	bgfx::ProgramHandle m_program3d;
 	bgfx::ProgramHandle m_programCmp;
+	bgfx::ProgramHandle m_programCompute;
 	bgfx::ProgramHandle m_program;
 	bgfx::UniformHandle u_time;
 	bgfx::UniformHandle s_texColor;

二进制
examples/runtime/shaders/dx11/cs_update.bin


二进制
examples/runtime/shaders/glsl/cs_update.bin


+ 8 - 1
src/bgfx_compute.sh

@@ -19,6 +19,7 @@
 #define rg16f   float2
 #define rgba16f float4
 #define rgba8   float4
+#define rgba32f float4
 
 #define IMAGE2D_RO( _name, _format, _reg) Texture2D<_format>   _name : register(t[_reg])
 #define UIMAGE2D_RO(_name, _format, _reg) Texture2D<_format>   _name : register(t[_reg])
@@ -153,12 +154,18 @@ uint atomicCompSwap(uint _mem, uint _compare, uint _data)
 #define readwrite
 #define IMAGE2D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D,  readonly)
 #define UIMAGE2D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, readonly)
-
 #define IMAGE2D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D,  writeonly)
 #define UIMAGE2D_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2D, writeonly)
 #define IMAGE2D_RW( _name, _reg) __IMAGE_XX(_name, r32f,  _reg, image2D,  readwrite)
 #define UIMAGE2D_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2D, readwrite)
 
+#define IMAGE2D_ARRAY_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray,  readonly)
+#define UIMAGE2D_ARRAY_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, readonly)
+#define IMAGE2D_ARRAY_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2DArray,  writeonly)
+#define UIMAGE2D_ARRAY_WR(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage2DArray, writeonly)
+#define IMAGE2D_ARRAY_RW( _name, _reg) __IMAGE_XX(_name, r32f,  _reg, image2DArray,  readwrite)
+#define UIMAGE2D_ARRAY_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2DArray, readwrite)
+
 #define IMAGE3D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D,  readonly)
 #define UIMAGE3D_RO(_name, _format, _reg) __IMAGE_XX(_name, _format, _reg, uimage3D, readonly)
 #define IMAGE3D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D,  writeonly)

+ 3 - 1
src/renderer_gl.cpp

@@ -3754,6 +3754,7 @@ namespace bgfx { namespace gl
 			GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_1D);
 
 			GLSL_TYPE(GL_IMAGE_2D);
+			GLSL_TYPE(GL_IMAGE_2D_ARRAY);
 			GLSL_TYPE(GL_INT_IMAGE_2D);
 			GLSL_TYPE(GL_UNSIGNED_INT_IMAGE_2D);
 
@@ -3851,6 +3852,7 @@ namespace bgfx { namespace gl
 		case GL_UNSIGNED_INT_IMAGE_1D:
 
 		case GL_IMAGE_2D:
+		case GL_IMAGE_2D_ARRAY:
 		case GL_INT_IMAGE_2D:
 		case GL_UNSIGNED_INT_IMAGE_2D:
 
@@ -6356,7 +6358,7 @@ namespace bgfx { namespace gl
 										GL_CHECK(glBindImageTexture(ii
 											, texture.m_id
 											, bind.m_un.m_compute.m_mip
-											, GL_FALSE
+											, texture.isCubeMap()?GL_TRUE:GL_FALSE
 											, 0
 											, s_access[bind.m_un.m_compute.m_access]
 											, s_imageFormat[bind.m_un.m_compute.m_format])