Cubemap as texture array OpenGL support + example

This commit is contained in:
benoitjacquier 2016-10-21 17:34:38 +02:00
parent 281d216e23
commit b19ca48387
6 changed files with 105 additions and 21 deletions

View File

@ -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) );
}
}

View File

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

Binary file not shown.

Binary file not shown.

View File

@ -19,6 +19,7 @@
#define rg16f float2 #define rg16f float2
#define rgba16f float4 #define rgba16f float4
#define rgba8 float4 #define rgba8 float4
#define rgba32f float4
#define IMAGE2D_RO( _name, _format, _reg) Texture2D<_format> _name : register(t[_reg]) #define IMAGE2D_RO( _name, _format, _reg) Texture2D<_format> _name : register(t[_reg])
#define UIMAGE2D_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 readwrite
#define IMAGE2D_RO( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image2D, readonly) #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 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 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 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 IMAGE2D_RW( _name, _reg) __IMAGE_XX(_name, r32f, _reg, image2D, readwrite)
#define UIMAGE2D_RW(_name, _reg) __IMAGE_XX(_name, r32ui, _reg, uimage2D, 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 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 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) #define IMAGE3D_WR( _name, _format, _reg) __IMAGE_XX(_name, _format, _reg, image3D, writeonly)

View File

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