Sfoglia il codice sorgente

GLES: Fixed clamp to border.

Branimir Karadžić 10 anni fa
parent
commit
c31ad50f31
4 ha cambiato i file con 42 aggiunte e 13 eliminazioni
  1. 11 11
      examples/08-update/update.cpp
  2. 4 0
      src/glimports.h
  3. 19 2
      src/renderer_gl.cpp
  4. 8 0
      src/renderer_gl.h

+ 11 - 11
examples/08-update/update.cpp

@@ -138,10 +138,10 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 
 	bgfx::TextureHandle textures[] =
 	{
-		loadTexture("texture_compression_bc1.dds", BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP),
-		loadTexture("texture_compression_bc2.dds", BGFX_TEXTURE_U_CLAMP),
-		loadTexture("texture_compression_bc3.dds", BGFX_TEXTURE_V_CLAMP),
-		loadTexture("texture_compression_etc1.ktx"),
+		loadTexture("texture_compression_bc1.dds",  BGFX_TEXTURE_U_CLAMP|BGFX_TEXTURE_V_CLAMP),
+		loadTexture("texture_compression_bc2.dds",  BGFX_TEXTURE_U_CLAMP),
+		loadTexture("texture_compression_bc3.dds",  BGFX_TEXTURE_V_CLAMP),
+		loadTexture("texture_compression_etc1.ktx", BGFX_TEXTURE_U_BORDER|BGFX_TEXTURE_V_BORDER),
 		loadTexture("texture_compression_etc2.ktx"),
 		loadTexture("texture_compression_ptc12.pvr"),
 		loadTexture("texture_compression_ptc14.pvr"),
@@ -364,12 +364,12 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 
 		// Set view and projection matrix for view 1.
 		const float aspectRatio = float(height)/float(width);
-		const float size = 10.0f;
+		const float size = 11.0f;
 		bx::mtxOrtho(proj, -size, size, size*aspectRatio, -size*aspectRatio, 0.0f, 1000.0f);
 		bgfx::setViewTransform(1, NULL, proj);
 
 
-		bx::mtxTranslate(mtx, -8.0f - BX_COUNTOF(textures)*0.1f*0.5f, 1.9f, 0.0f);
+		bx::mtxTranslate(mtx, -size+2.0f - BX_COUNTOF(textures)*0.1f*0.5f, 1.9f, 0.0f);
 
 		// Set model matrix for rendering.
 		bgfx::setTransform(mtx);
@@ -387,11 +387,11 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 		// Submit primitive for rendering to view 1.
 		bgfx::submit(1, programCmp);
 
-		const float xpos = -8.0f - BX_COUNTOF(textures)*0.1f*0.5f;
+		const float xpos = -size+2.0f - BX_COUNTOF(textures)*0.1f*0.5f;
 
 		for (uint32_t ii = 0; ii < BX_COUNTOF(textures); ++ii)
 		{
-			bx::mtxTranslate(mtx, xpos + ii*2.1f, 4.0f, 0.0f);
+			bx::mtxTranslate(mtx, xpos + ii*2.1f, size-6.5f, 0.0f);
 
 			// Set model matrix for rendering.
 			bgfx::setTransform(mtx);
@@ -412,7 +412,7 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 
 		for (uint32_t ii = 0; ii < numTextures3d; ++ii)
 		{
-			bx::mtxTranslate(mtx, xpos + ii*2.1f, -4.0f, 0.0f);
+			bx::mtxTranslate(mtx, xpos + ii*2.1f, -size+6.5f, 0.0f);
 
 			// Set model matrix for rendering.
 			bgfx::setTransform(mtx);
@@ -431,9 +431,9 @@ int _main_(int /*_argc*/, char** /*_argv*/)
 			bgfx::submit(1, program3d);
 		}
 
-		for (uint32_t ii = 0; ii < 3; ++ii)
+		for (uint32_t ii = 0; ii < 4; ++ii)
 		{
-			bx::mtxTranslate(mtx, xpos + 8*2.1f, -4.0f + ii*2.1f, 0.0f);
+			bx::mtxTranslate(mtx, xpos + (size-2.0f)*2.1f, -size+6.5f + ii*2.1f, 0.0f);
 
 			// Set model matrix for rendering.
 			bgfx::setTransform(mtx);

+ 4 - 0
src/glimports.h

@@ -167,6 +167,7 @@ typedef void           (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum targe
 typedef void           (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height);
 typedef void           (GL_APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param);
 typedef void           (GL_APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param);
+typedef void           (GL_APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param);
 typedef void           (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
 typedef void           (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
 typedef void           (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask);
@@ -178,6 +179,7 @@ typedef void           (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, G
 typedef void           (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
 typedef void           (GL_APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels);
 typedef void           (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param);
+typedef void           (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat* param);
 typedef void           (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
 typedef void           (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params);
 typedef void           (GL_APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
@@ -346,6 +348,7 @@ GL_IMPORT______(true,  PFNGLRENDERBUFFERSTORAGEPROC,               glRenderbuffe
 GL_IMPORT______(true,  PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC,    glRenderbufferStorageMultisample);
 GL_IMPORT______(true,  PFNGLSAMPLERPARAMETERIPROC,                 glSamplerParameteri);
 GL_IMPORT______(true,  PFNGLSAMPLERPARAMETERFPROC,                 glSamplerParameterf);
+GL_IMPORT______(true,  PFNGLSAMPLERPARAMETERFVPROC,                glSamplerParameterfv);
 GL_IMPORT______(false, PFNGLSCISSORPROC,                           glScissor);
 GL_IMPORT______(false, PFNGLSHADERSOURCEPROC,                      glShaderSource);
 GL_IMPORT______(false, PFNGLSTENCILFUNCPROC,                       glStencilFunc);
@@ -359,6 +362,7 @@ GL_IMPORT______(true,  PFNGLTEXIMAGE3DPROC,                        glTexImage3D)
 GL_IMPORT______(false, PFNGLTEXPARAMETERIPROC,                     glTexParameteri);
 GL_IMPORT______(false, PFNGLTEXPARAMETERIVPROC,                    glTexParameteriv);
 GL_IMPORT______(false, PFNGLTEXPARAMETERFPROC,                     glTexParameterf);
+GL_IMPORT______(false, PFNGLTEXPARAMETERFVPROC,                    glTexParameterfv);
 GL_IMPORT______(true,  PFNGLTEXSTORAGE2DPROC,                      glTexStorage2D);
 GL_IMPORT______(true,  PFNGLTEXSTORAGE3DPROC,                      glTexStorage3D);
 GL_IMPORT______(false, PFNGLTEXSUBIMAGE2DPROC,                     glTexSubImage2D);

+ 19 - 2
src/renderer_gl.cpp

@@ -155,12 +155,12 @@ namespace bgfx { namespace gl
 		GL_BACK,
 	};
 
-	static const GLenum s_textureAddress[] =
+	static GLenum s_textureAddress[] =
 	{
 		GL_REPEAT,
 		GL_MIRRORED_REPEAT,
 		GL_CLAMP_TO_EDGE,
-		GL_CLAMP,
+		GL_CLAMP_TO_BORDER,
 	};
 
 	static const GLenum s_textureFilterMag[] =
@@ -550,6 +550,7 @@ namespace bgfx { namespace gl
 			MOZ_WEBGL_compressed_texture_s3tc,
 			MOZ_WEBGL_depth_texture,
 
+			NV_texture_border_clamp,
 			NV_draw_buffers,
 			NVX_gpu_memory_info,
 
@@ -747,6 +748,7 @@ namespace bgfx { namespace gl
 		{ "MOZ_WEBGL_compressed_texture_s3tc",     false,                             true  },
 		{ "MOZ_WEBGL_depth_texture",               false,                             true  },
 
+		{ "NV_texture_border_clamp",               false,                             true  }, // GLES2 extension.
 		{ "NV_draw_buffers",                       false,                             true  }, // GLES2 extension.
 		{ "NVX_gpu_memory_info",                   false,                             true  },
 
@@ -1778,6 +1780,14 @@ namespace bgfx { namespace gl
 
 			g_caps.supported |= m_glctx.getCaps();
 
+			if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) )
+			{
+				s_textureAddress[BGFX_TEXTURE_U_BORDER>>BGFX_TEXTURE_U_SHIFT] = s_extension[Extension::NV_texture_border_clamp].m_supported
+					? GL_CLAMP_TO_BORDER
+					: GL_CLAMP_TO_EDGE
+					;
+			}
+
 			if (s_extension[Extension::EXT_texture_filter_anisotropic].m_supported)
 			{
 				GL_CHECK(glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_maxAnisotropyDefault) );
@@ -2542,6 +2552,9 @@ namespace bgfx { namespace gl
 						GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MAG_FILTER, magFilter) );
 						GL_CHECK(glSamplerParameteri(sampler, GL_TEXTURE_MIN_FILTER, minFilter) );
 
+						const float color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+						GL_CHECK(glSamplerParameterfv(sampler, GL_TEXTURE_BORDER_COLOR, color) );
+
 						if (0 != (_flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) )
 						&&  0.0f < m_maxAnisotropy)
 						{
@@ -4186,6 +4199,10 @@ namespace bgfx { namespace gl
 			getFilters(flags, 1 < numMips, magFilter, minFilter);
 			GL_CHECK(glTexParameteri(target, GL_TEXTURE_MAG_FILTER, magFilter) );
 			GL_CHECK(glTexParameteri(target, GL_TEXTURE_MIN_FILTER, minFilter) );
+
+			const float color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
+			GL_CHECK(glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, color) );
+
 			if (0 != (flags & (BGFX_TEXTURE_MIN_ANISOTROPIC|BGFX_TEXTURE_MAG_ANISOTROPIC) )
 			&&  0.0f < s_renderGL->m_maxAnisotropy)
 			{

+ 8 - 0
src/renderer_gl.h

@@ -753,6 +753,14 @@ typedef uint64_t GLuint64;
 #	define GL_DEPTH_CLAMP 0x864F
 #endif // GL_DEPTH_CLAMP
 
+#ifndef GL_TEXTURE_BORDER_COLOR
+#	define GL_TEXTURE_BORDER_COLOR 0x1004
+#endif // GL_TEXTURE_BORDER_COLOR
+
+#ifndef GL_CLAMP_TO_BORDER
+#	define GL_CLAMP_TO_BORDER 0x812D
+#endif // GL_CLAMP_TO_BORDER
+
 #ifndef GL_TEXTURE_CUBE_MAP_SEAMLESS
 #	define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F
 #endif // GL_TEXTURE_CUBE_MAP_SEAMLESS