Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -169,12 +169,17 @@ public static GLImageFormat[][] getFormatsForCaps(EnumSet<Caps> caps) {
format(formatToGL, Format.RGB565, GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_SHORT_5_6_5, opengl || opengles3 || webgl, false, true);
}

// Additional desktop-specific formats.
// Additional byte-order formats supported directly on desktop GL.
if (opengl) {
format(formatToGL, Format.BGR8, GL2.GL_RGB8, GL2.GL_BGR, GL.GL_UNSIGNED_BYTE, true, false, true);
format(formatToGL, Format.ARGB8, GLExt.GL_RGBA8, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
format(formatToGL, Format.BGRA8, GLExt.GL_RGBA8, GL2.GL_BGRA, GL.GL_UNSIGNED_BYTE, true, false, true);
format(formatToGL, Format.ABGR8, GLExt.GL_RGBA8, GL.GL_RGBA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
} else if (opengles3) {
formatSwiz(formatToGL, Format.BGR8, GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, true, false, true);
formatSwiz(formatToGL, Format.ARGB8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
formatSwiz(formatToGL, Format.BGRA8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
formatSwiz(formatToGL, Format.ABGR8, GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
}

// sRGB formats
Expand All @@ -193,6 +198,12 @@ public static GLImageFormat[][] getFormatsForCaps(EnumSet<Caps> caps) {
formatSrgb(formatToGL, Format.ABGR8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
formatSrgb(formatToGL, Format.ARGB8, GLExt.GL_SRGB8_ALPHA8_EXT, GL2.GL_BGRA, GL2.GL_UNSIGNED_INT_8_8_8_8, true, false, true);
formatSrgb(formatToGL, Format.BGRA8, GLExt.GL_SRGB8_ALPHA8_EXT, GL2.GL_BGRA, GL.GL_UNSIGNED_BYTE, true, false, true);
} else if (opengles3) {
// Match GLES RGB8/sRGB8 renderability for the same internal format.
formatSrgbSwiz(formatToGL, Format.BGR8, GLExt.GL_SRGB8_EXT, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, false, false, true);
formatSrgbSwiz(formatToGL, Format.ARGB8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
formatSrgbSwiz(formatToGL, Format.BGRA8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
formatSrgbSwiz(formatToGL, Format.ABGR8, GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true, false, true);
}

if (caps.contains(Caps.TextureCompressionS3TC)) {
Expand Down
18 changes: 18 additions & 0 deletions jme3-core/src/main/java/com/jme3/renderer/opengl/TextureUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,24 @@ private void setupTextureSwizzle(int target, Format format) {
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_GREEN);
break;
case BGR8:
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_BLUE);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_GREEN);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_ONE);
break;
case ARGB8:
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_GREEN);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_BLUE);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_ALPHA);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_RED);
break;
case BGRA8:
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_BLUE);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_GREEN);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_B, GL.GL_RED);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_A, GL.GL_ALPHA);
break;
case ABGR8:
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_R, GL.GL_ALPHA);
gl.glTexParameteri(target, GL3.GL_TEXTURE_SWIZZLE_G, GL.GL_BLUE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class GLImageFormatsTest {

Expand All @@ -56,20 +57,29 @@ public void testGles3UsesCoreHalfFloatType() {
}

@Test
public void testGles3DoesNotExposeDesktopByteOrderFormats() {
public void testGles3ExposesByteOrderFormatsViaSwizzle() {
EnumSet<Caps> caps = EnumSet.of(Caps.OpenGLES20, Caps.OpenGLES30,
Caps.CoreProfile, Caps.Srgb);

GLImageFormat[][] formats = GLImageFormats.getFormatsForCaps(caps);

assertNull(formats[0][Image.Format.BGR8.ordinal()]);
assertNull(formats[0][Image.Format.ABGR8.ordinal()]);
assertNull(formats[0][Image.Format.ARGB8.ordinal()]);
assertNull(formats[0][Image.Format.BGRA8.ordinal()]);
assertNull(formats[1][Image.Format.BGR8.ordinal()]);
assertNull(formats[1][Image.Format.ABGR8.ordinal()]);
assertNull(formats[1][Image.Format.ARGB8.ordinal()]);
assertNull(formats[1][Image.Format.BGRA8.ordinal()]);
assertGles3SwizzledFormat(formats[0][Image.Format.BGR8.ordinal()],
GL2.GL_RGB8, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, true);
assertGles3SwizzledFormat(formats[0][Image.Format.ARGB8.ordinal()],
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
assertGles3SwizzledFormat(formats[0][Image.Format.BGRA8.ordinal()],
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
assertGles3SwizzledFormat(formats[0][Image.Format.ABGR8.ordinal()],
GLExt.GL_RGBA8, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);

assertGles3SwizzledFormat(formats[1][Image.Format.BGR8.ordinal()],
GLExt.GL_SRGB8_EXT, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, false);
assertGles3SwizzledFormat(formats[1][Image.Format.ARGB8.ordinal()],
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
assertGles3SwizzledFormat(formats[1][Image.Format.BGRA8.ordinal()],
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
assertGles3SwizzledFormat(formats[1][Image.Format.ABGR8.ordinal()],
GLExt.GL_SRGB8_ALPHA8_EXT, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, true);
}

@Test
Expand Down Expand Up @@ -130,4 +140,14 @@ public void testDepthFormatsFollowExplicitCaps() {

assertNotNull(formats[0][Image.Format.Depth32.ordinal()]);
}

private static void assertGles3SwizzledFormat(GLImageFormat format, int internalFormat,
int glFormat, int dataType, boolean colorRenderable) {
assertNotNull(format);
assertEquals(internalFormat, format.internalFormat);
assertEquals(glFormat, format.format);
assertEquals(dataType, format.dataType);
assertEquals(colorRenderable, format.colorRenderable);
assertTrue(format.swizzleRequired);
}
}
Loading