[Scummvm-git-logs] scummvm master -> ed837d20a883ffc28db33f9d46630444dad288e5

aquadran noreply at scummvm.org
Fri Dec 3 22:35:03 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
ed837d20a8 PLAYGROUND3D: Added bitmap test


Commit: ed837d20a883ffc28db33f9d46630444dad288e5
    https://github.com/scummvm/scummvm/commit/ed837d20a883ffc28db33f9d46630444dad288e5
Author: Paweł Kołodziejski (aquadran at gmail.com)
Date: 2021-12-03T23:34:58+01:00

Commit Message:
PLAYGROUND3D: Added bitmap test

Changed paths:
  A engines/playground3d/shaders/playground3d_bitmap.fragment
  A engines/playground3d/shaders/playground3d_bitmap.vertex
    dists/scummvm.rc
    engines/playground3d/gfx.cpp
    engines/playground3d/gfx.h
    engines/playground3d/gfx_opengl.cpp
    engines/playground3d/gfx_opengl.h
    engines/playground3d/gfx_opengl_shaders.cpp
    engines/playground3d/gfx_opengl_shaders.h
    engines/playground3d/gfx_tinygl.cpp
    engines/playground3d/gfx_tinygl.h
    engines/playground3d/playground3d.cpp
    engines/playground3d/playground3d.h


diff --git a/dists/scummvm.rc b/dists/scummvm.rc
index 91423e6747..458c15b202 100644
--- a/dists/scummvm.rc
+++ b/dists/scummvm.rc
@@ -186,6 +186,8 @@ shaders/wme_sprite.fragment             FILE    "engines/wintermute/base/gfx/ope
 shaders/wme_sprite.vertex               FILE    "engines/wintermute/base/gfx/opengl/shaders/wme_sprite.vertex"
 #endif
 #if PLUGIN_ENABLED_STATIC(PLAYGROUND3D)
+shaders/playground3d_bitmap.fragment    FILE    "engines/playground3d/shaders/playground3d_bitmap.fragment"
+shaders/playground3d_bitmap.vertex      FILE    "engines/playground3d/shaders/playground3d_bitmap.vertex"
 shaders/playground3d_cube.fragment      FILE    "engines/playground3d/shaders/playground3d_cube.fragment"
 shaders/playground3d_cube.vertex        FILE    "engines/playground3d/shaders/playground3d_cube.vertex"
 shaders/playground3d_fade.fragment      FILE    "engines/playground3d/shaders/playground3d_fade.fragment"
diff --git a/engines/playground3d/gfx.cpp b/engines/playground3d/gfx.cpp
index 7046ef7d0b..9480d91d95 100644
--- a/engines/playground3d/gfx.cpp
+++ b/engines/playground3d/gfx.cpp
@@ -96,7 +96,6 @@ void Renderer::computeScreenViewport() {
 
 Math::Matrix4 Renderer::makeProjectionMatrix(float fov, float nearClip, float farClip) const {
 	float aspectRatio = kOriginalWidth / (float) kOriginalHeight;
-
 	float xmaxValue = nearClip * tanf(fov * M_PI / 360.0f);
 	float ymaxValue = xmaxValue / aspectRatio;
 	return Math::makeFrustumMatrix(-xmaxValue, xmaxValue, -ymaxValue, ymaxValue, nearClip, farClip);
@@ -109,7 +108,6 @@ void Renderer::setupCameraPerspective(float pitch, float heading, float fov) {
 	Math::Matrix4 model = _modelViewMatrix;
 	proj.transpose();
 	model.transpose();
-
 	_mvpMatrix = proj * model;
 	_mvpMatrix.transpose();
 }
diff --git a/engines/playground3d/gfx.h b/engines/playground3d/gfx.h
index 203d8ffd35..568171c0bd 100644
--- a/engines/playground3d/gfx.h
+++ b/engines/playground3d/gfx.h
@@ -30,6 +30,9 @@
 #include "math/matrix4.h"
 #include "math/vector3d.h"
 
+#include "graphics/surface.h"
+#include "graphics/pixelformat.h"
+
 namespace Playground3d {
 
 class Renderer {
@@ -38,6 +41,7 @@ public:
 	virtual ~Renderer();
 
 	virtual void init() = 0;
+	virtual void deinit() = 0;
 	virtual void clear(const Math::Vector4d &clearColor) = 0;
 
 	/**
@@ -55,10 +59,13 @@ public:
 	void computeScreenViewport();
 
 	virtual void setupViewport(int x, int y, int width, int height) = 0;
+	virtual void loadTextureRGBA(Graphics::Surface *texture) = 0;
+	virtual void loadTextureRGB(Graphics::Surface *texture) = 0;
 	virtual void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) = 0;
 	virtual void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) = 0;
 	virtual void dimRegionInOut(float fade) = 0;
 	virtual void drawInViewport() = 0;
+	virtual void drawRgbaTexture() = 0;
 
 protected:
 	OSystem *_system;
@@ -70,6 +77,7 @@ protected:
 	Math::Matrix4 _mvpMatrix;
 
 	static const float cubeVertices[11 * 6 * 4];
+	Graphics::Surface *_texture;
 
 	Math::Matrix4 makeProjectionMatrix(float fov, float nearClip, float farClip) const;
 };
diff --git a/engines/playground3d/gfx_opengl.cpp b/engines/playground3d/gfx_opengl.cpp
index 4b1a9efbae..359bebff9b 100644
--- a/engines/playground3d/gfx_opengl.cpp
+++ b/engines/playground3d/gfx_opengl.cpp
@@ -49,6 +49,22 @@ static const GLfloat boxVertices[] = {
 	 1.0f, -1.0f,
 };
 
+static const GLfloat bitmapVertices[] = {
+	//  X      Y
+	-0.2f,  0.2f,
+	 0.2f,  0.2f,
+	-0.2f, -0.2f,
+	 0.2f, -0.2f,
+};
+
+static const GLfloat textCords[] = {
+	// S     T
+	0.0f, 0.0f,
+	1.0f, 0.0f,
+	0.0f, 1.0f,
+	1.0f, 1.0f,
+};
+
 Renderer *CreateGfxOpenGL(OSystem *system) {
 	return new OpenGLRenderer(system);
 }
@@ -79,6 +95,14 @@ void OpenGLRenderer::init() {
 	glDisable(GL_TEXTURE_2D);
 	glDisable(GL_LIGHTING);
 	glEnable(GL_DEPTH_TEST);
+
+	glGenTextures(10, _textureRgbaId);
+	glGenTextures(10, _textureRgbId);
+}
+
+void OpenGLRenderer::deinit() {
+	glDeleteTextures(10, _textureRgbaId);
+	glDeleteTextures(10, _textureRgbId);
 }
 
 void OpenGLRenderer::clear(const Math::Vector4d &clearColor) {
@@ -86,6 +110,44 @@ void OpenGLRenderer::clear(const Math::Vector4d &clearColor) {
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
+void OpenGLRenderer::loadTextureRGBA(Graphics::Surface *texture) {
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[0]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[1]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[2]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[3]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[4]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[5]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+}
+
+void OpenGLRenderer::loadTextureRGB(Graphics::Surface *texture) {
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[0]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[1]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGR, GL_UNSIGNED_BYTE, texture->getPixels());
+}
+
 void OpenGLRenderer::setupViewport(int x, int y, int width, int height) {
 	glViewport(x, y, width, height);
 }
@@ -225,6 +287,118 @@ void OpenGLRenderer::drawInViewport() {
 	glPopMatrix();
 }
 
+void OpenGLRenderer::drawRgbaTexture() {
+	glMatrixMode(GL_PROJECTION);
+	glPushMatrix();
+	glLoadIdentity();
+
+	glMatrixMode(GL_MODELVIEW);
+	glPushMatrix();
+	glLoadIdentity();
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
+	glEnable(GL_TEXTURE_2D);
+
+	glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+
+	glTranslatef(-0.8, 0.8, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[0]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[1]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[2]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[3]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(-1.5, -0.5, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[4]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[5]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[0]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glTranslatef(0.5, 0, 0);
+
+	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+	glVertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), bitmapVertices);
+	glTexCoordPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), textCords);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[1]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+	glDisableClientState(GL_VERTEX_ARRAY);
+	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
+
+	glMatrixMode(GL_PROJECTION);
+	glPopMatrix();
+}
+
 } // End of namespace Playground3d
 
 #endif
diff --git a/engines/playground3d/gfx_opengl.h b/engines/playground3d/gfx_opengl.h
index 0b357d6289..4be560f262 100644
--- a/engines/playground3d/gfx_opengl.h
+++ b/engines/playground3d/gfx_opengl.h
@@ -40,17 +40,23 @@ public:
 	virtual ~OpenGLRenderer();
 
 	void init() override;
+	void deinit() override;
 
 	void clear(const Math::Vector4d &clearColor) override;
+	void loadTextureRGBA(Graphics::Surface *texture) override;
+	void loadTextureRGB(Graphics::Surface *texture) override;
 
 	void setupViewport(int x, int y, int width, int height) override;
 	void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void dimRegionInOut(float fade) override;
 	void drawInViewport() override;
+	void drawRgbaTexture() override;
 
 private:
 	Math::Vector3d _pos;
+	GLuint _textureRgbaId[10];
+	GLuint _textureRgbId[10];
 
 	void drawFace(uint face);
 };
diff --git a/engines/playground3d/gfx_opengl_shaders.cpp b/engines/playground3d/gfx_opengl_shaders.cpp
index c33c0ecf84..dc926a1b89 100644
--- a/engines/playground3d/gfx_opengl_shaders.cpp
+++ b/engines/playground3d/gfx_opengl_shaders.cpp
@@ -47,6 +47,14 @@ static const GLfloat dimRegionVertices[] = {
 	 0.5f, -0.5f,
 };
 
+static const GLfloat bitmapVertices[] = {
+	//  X      Y     S     T
+	-0.2f,  0.2f, 0.0f, 0.0f,
+	 0.2f,  0.2f, 1.0f, 0.0f,
+	-0.2f, -0.2f, 0.0f, 1.0f,
+	 0.2f, -0.2f, 1.0f, 1.0f,
+};
+
 Renderer *CreateGfxOpenGLShader(OSystem *system) {
 	return new ShaderRenderer(system);
 }
@@ -57,15 +65,18 @@ ShaderRenderer::ShaderRenderer(OSystem *system) :
 		_cubeShader(nullptr),
 		_fadeShader(nullptr),
 		_cubeVBO(0),
-		_fadeVBO(0) {
+		_fadeVBO(0),
+		_bitmapVBO(0) {
 }
 
 ShaderRenderer::~ShaderRenderer() {
 	OpenGL::ShaderGL::freeBuffer(_cubeVBO);
 	OpenGL::ShaderGL::freeBuffer(_fadeVBO);
+	OpenGL::ShaderGL::freeBuffer(_bitmapVBO);
 
 	delete _cubeShader;
 	delete _fadeShader;
+	delete _bitmapShader;
 }
 
 void ShaderRenderer::init() {
@@ -83,10 +94,24 @@ void ShaderRenderer::init() {
 	_cubeShader->enableVertexAttribute("normal", _cubeVBO, 3, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 20);
 	_cubeShader->enableVertexAttribute("color", _cubeVBO, 3, GL_FLOAT, GL_FALSE, 11 * sizeof(float), 32);
 
-	static const char* fadeAttributes[] = { "position", nullptr };
+	static const char *fadeAttributes[] = { "position", nullptr };
 	_fadeShader = OpenGL::ShaderGL::fromFiles("playground3d_fade", fadeAttributes);
 	_fadeVBO = OpenGL::ShaderGL::createBuffer(GL_ARRAY_BUFFER, sizeof(dimRegionVertices), dimRegionVertices);
 	_fadeShader->enableVertexAttribute("position", _fadeVBO, 2, GL_FLOAT, GL_TRUE, 2 * sizeof(float), 0);
+
+	static const char *bitmapAttributes[] = { "position", "texcoord", nullptr };
+	_bitmapShader = OpenGL::ShaderGL::fromFiles("playground3d_bitmap", bitmapAttributes);
+	_bitmapVBO = OpenGL::ShaderGL::createBuffer(GL_ARRAY_BUFFER, sizeof(bitmapVertices), bitmapVertices);
+	_bitmapShader->enableVertexAttribute("position", _bitmapVBO, 2, GL_FLOAT, GL_TRUE, 4 * sizeof(float), 0);
+	_bitmapShader->enableVertexAttribute("texcoord", _bitmapVBO, 2, GL_FLOAT, GL_TRUE, 4 * sizeof(float), 8);
+
+	glGenTextures(10, _textureRgbaId);
+	glGenTextures(10, _textureRgbId);
+}
+
+void ShaderRenderer::deinit() {
+	glDeleteTextures(10, _textureRgbaId);
+	glDeleteTextures(10, _textureRgbId);
 }
 
 void ShaderRenderer::clear(const Math::Vector4d &clearColor) {
@@ -94,6 +119,44 @@ void ShaderRenderer::clear(const Math::Vector4d &clearColor) {
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 }
 
+void ShaderRenderer::loadTextureRGBA(Graphics::Surface *texture) {
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[0]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[1]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[2]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[3]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[4]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[5]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+}
+
+void ShaderRenderer::loadTextureRGB(Graphics::Surface *texture) {
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[0]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture->getPixels());
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[1]);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->w, texture->h, 0, GL_BGR, GL_UNSIGNED_BYTE, texture->getPixels());
+}
+
 void ShaderRenderer::setupViewport(int x, int y, int width, int height) {
 	glViewport(x, y, width, height);
 }
@@ -131,7 +194,67 @@ void ShaderRenderer::dimRegionInOut(float fade) {
 }
 
 void ShaderRenderer::drawInViewport() {
-	// TODO
+	error("Draw in viewport test not implemented yet");
+}
+
+void ShaderRenderer::drawRgbaTexture() {
+	Math::Vector2d offset;
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+	glDisable(GL_DEPTH_TEST);
+	glDepthMask(GL_FALSE);
+
+	_bitmapShader->use();
+
+	offset.setX(-0.8);
+	offset.setY(0.8);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[0]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(-0.3);
+	offset.setY(0.8);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[1]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(0.2);
+	offset.setY(0.8);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[2]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(0.7);
+	offset.setY(0.8);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[3]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(-0.8);
+	offset.setY(0.3);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[4]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(-0.3);
+	offset.setY(0.3);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbaId[5]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(0.2);
+	offset.setY(0.3);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[0]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	offset.setX(0.7);
+	offset.setY(0.3);
+	_bitmapShader->setUniform("offsetXY", offset);
+	glBindTexture(GL_TEXTURE_2D, _textureRgbId[1]);
+	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+	_bitmapShader->unbind();
 }
 
 } // End of namespace Playground3d
diff --git a/engines/playground3d/gfx_opengl_shaders.h b/engines/playground3d/gfx_opengl_shaders.h
index 006ed71841..171f2d4d57 100644
--- a/engines/playground3d/gfx_opengl_shaders.h
+++ b/engines/playground3d/gfx_opengl_shaders.h
@@ -40,23 +40,31 @@ public:
 	virtual ~ShaderRenderer();
 
 	void init() override;
+	void deinit() override;
 
 	void clear(const Math::Vector4d &clearColor) override;
+	void loadTextureRGBA(Graphics::Surface *texture) override;
+	void loadTextureRGB(Graphics::Surface *texture) override;
 
 	void setupViewport(int x, int y, int width, int height) override;
 	void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void dimRegionInOut(float fade) override;
 	void drawInViewport() override;
+	void drawRgbaTexture() override;
 
 private:
 	OpenGL::ShaderGL *_cubeShader;
 	OpenGL::ShaderGL *_fadeShader;
+	OpenGL::ShaderGL *_bitmapShader;
 
 	GLuint _cubeVBO;
 	GLuint _fadeVBO;
+	GLuint _bitmapVBO;
 
 	Common::Rect _currentViewport;
+	GLuint _textureRgbaId[10];
+	GLuint _textureRgbId[10];
 };
 
 } // End of namespace Playground3d
diff --git a/engines/playground3d/gfx_tinygl.cpp b/engines/playground3d/gfx_tinygl.cpp
index b1e6494ce2..acea6b30bb 100644
--- a/engines/playground3d/gfx_tinygl.cpp
+++ b/engines/playground3d/gfx_tinygl.cpp
@@ -55,6 +55,22 @@ static const TGLfloat boxVertices[] = {
 	 1.0f, -1.0f,
 };
 
+static const TGLfloat bitmapVertices[] = {
+	//  X      Y
+	-0.2f,  0.2f,
+	 0.2f,  0.2f,
+	-0.2f, -0.2f,
+	 0.2f, -0.2f,
+};
+
+static const TGLfloat textCords[] = {
+	// S     T
+	0.0f, 0.0f,
+	1.0f, 0.0f,
+	0.0f, 1.0f,
+	1.0f, 1.0f,
+};
+
 Renderer *CreateGfxTinyGL(OSystem *system) {
 	return new TinyGLRenderer(system);
 }
@@ -84,6 +100,52 @@ void TinyGLRenderer::init() {
 
 	tglDisable(TGL_LIGHTING);
 	tglEnable(TGL_DEPTH_TEST);
+
+	tglGenTextures(10, _textureRgbaId);
+	tglGenTextures(10, _textureRgbId);
+}
+
+void TinyGLRenderer::deinit() {
+	//tglDeleteTextures(10, &_textureRgbaId);
+	//tglDeleteTextures(10, &_textureRgbId);
+}
+
+void TinyGLRenderer::loadTextureRGBA(Graphics::Surface *texture) {
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[0]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_RGBA, TGL_UNSIGNED_BYTE, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[1]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_BGRA, TGL_UNSIGNED_BYTE, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[2]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_RGBA, TGL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[3]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_BGRA, TGL_UNSIGNED_INT_8_8_8_8, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[4]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_RGBA, TGL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[5]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_BGRA, TGL_UNSIGNED_INT_8_8_8_8_REV, texture->getPixels());
+}
+
+void TinyGLRenderer::loadTextureRGB(Graphics::Surface *texture) {
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbId[0]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_RGB, TGL_UNSIGNED_BYTE, texture->getPixels());
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbId[1]);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MIN_FILTER, TGL_NEAREST);
+	tglTexParameteri(TGL_TEXTURE_2D, TGL_TEXTURE_MAG_FILTER, TGL_NEAREST);
+	tglTexImage2D(TGL_TEXTURE_2D, 0, TGL_RGBA, texture->w, texture->h, 0, TGL_BGR, TGL_UNSIGNED_BYTE, texture->getPixels());
 }
 
 void TinyGLRenderer::clear(const Math::Vector4d &clearColor) {
@@ -236,4 +298,116 @@ void TinyGLRenderer::drawInViewport() {
 	tglPopMatrix();
 }
 
+void TinyGLRenderer::drawRgbaTexture() {
+	tglMatrixMode(TGL_PROJECTION);
+	tglPushMatrix();
+	tglLoadIdentity();
+
+	tglMatrixMode(TGL_MODELVIEW);
+	tglPushMatrix();
+	tglLoadIdentity();
+
+	tglEnable(TGL_BLEND);
+	tglBlendFunc(TGL_ONE, TGL_ONE_MINUS_SRC_ALPHA);
+	tglDisable(TGL_DEPTH_TEST);
+	tglDepthMask(TGL_FALSE);
+	tglEnable(TGL_TEXTURE_2D);
+
+	tglColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+
+	tglTranslatef(-0.8, 0.8, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[0]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[1]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[2]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[3]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(-1.5, -0.5, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[4]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbaId[5]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbId[0]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglTranslatef(0.5, 0, 0);
+
+	tglEnableClientState(TGL_VERTEX_ARRAY);
+	tglEnableClientState(TGL_TEXTURE_COORD_ARRAY);
+	tglVertexPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), bitmapVertices);
+	tglTexCoordPointer(2, TGL_FLOAT, 2 * sizeof(TGLfloat), textCords);
+	tglBindTexture(TGL_TEXTURE_2D, _textureRgbId[1]);
+	tglDrawArrays(TGL_TRIANGLE_STRIP, 0, 4);
+	tglDisableClientState(TGL_VERTEX_ARRAY);
+	tglDisableClientState(TGL_TEXTURE_COORD_ARRAY);
+
+	tglMatrixMode(TGL_MODELVIEW);
+	tglPopMatrix();
+
+	tglMatrixMode(TGL_PROJECTION);
+	tglPopMatrix();
+}
+
 } // End of namespace Playground3d
diff --git a/engines/playground3d/gfx_tinygl.h b/engines/playground3d/gfx_tinygl.h
index b68bd9aa77..36fb146171 100644
--- a/engines/playground3d/gfx_tinygl.h
+++ b/engines/playground3d/gfx_tinygl.h
@@ -40,20 +40,26 @@ public:
 	virtual ~TinyGLRenderer();
 
 	void init() override;
+	void deinit() override;
 
 	void clear(const Math::Vector4d &clearColor) override;
+	void loadTextureRGB(Graphics::Surface *texture) override;
+	void loadTextureRGBA(Graphics::Surface *texture) override;
 
 	void setupViewport(int x, int y, int width, int height) override;
 	void drawCube(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void drawPolyOffsetTest(const Math::Vector3d &pos, const Math::Vector3d &roll) override;
 	void dimRegionInOut(float fade) override;
 	void drawInViewport() override;
+	void drawRgbaTexture() override;
 
 	void flipBuffer() override;
 
 private:
 	TinyGL::FrameBuffer *_fb;
 	Math::Vector3d _pos;
+	TGLuint _textureRgbaId[10];
+	TGLuint _textureRgbId[10];
 
 	void drawFace(uint face);
 };
diff --git a/engines/playground3d/playground3d.cpp b/engines/playground3d/playground3d.cpp
index 73be2b207a..1a5be72fe3 100644
--- a/engines/playground3d/playground3d.cpp
+++ b/engines/playground3d/playground3d.cpp
@@ -68,6 +68,7 @@ Common::Error Playground3dEngine::run() {
 	// 3 - fade in/out
 	// 4 - moving filled rectangle in viewport
 	int testId = 1;
+	// 5 - drawing RGBA pattern texture to check endian correctness
 
 	switch (testId) {
 		case 1:
@@ -83,6 +84,19 @@ Common::Error Playground3dEngine::run() {
 		case 4:
 			_clearColor = Math::Vector4d(0.5f, 0.5f, 0.5f, 1.0f);
 			break;
+		case 5: {
+			_clearColor = Math::Vector4d(0.5f, 0.5f, 0.5f, 1.0f);
+#if defined(SCUMM_LITTLE_ENDIAN)
+			Graphics::PixelFormat pixelFormatRGBA(4, 8, 8, 8, 8, 0, 8, 16, 24);
+			Graphics::PixelFormat pixelFormatRGB(3, 8, 8, 8, 0, 0, 8, 16, 0);
+#else
+			Graphics::PixelFormat pixelFormatRGBA(4, 8, 8, 8, 8, 24, 16, 8, 0);
+			Graphics::PixelFormat pixelFormatRGB(3, 8, 8, 8, 0, 0, 8, 16, 0);
+#endif
+			_rgbaTexture = generateRgbaTexture(120, 120, pixelFormatRGBA);
+			_rgbTexture = _rgbaTexture->convertTo(pixelFormatRGB);
+			break;
+		}
 		default:
 			assert(false);
 	}
@@ -92,6 +106,9 @@ Common::Error Playground3dEngine::run() {
 		drawFrame(testId);
 	}
 
+	delete _rgbaTexture;
+	delete _rgbTexture;
+	_gfx->deinit();
 	_system->showMouse(false);
 
 	return Common::kNoError;
@@ -107,6 +124,28 @@ void Playground3dEngine::processInput() {
 	}
 }
 
+Graphics::Surface *Playground3dEngine::generateRgbaTexture(int width, int height, Graphics::PixelFormat format) {
+	Graphics::Surface *surface = new Graphics::Surface;
+	surface->create(width, height, format);
+	const int barW = width / 4;
+	Common::Rect r(0, 0, barW, height);
+	uint32 pixel = format.ARGBToColor(255, 255, 0, 0);
+	surface->fillRect(r, pixel);
+	r.left += barW;
+	r.right += barW;
+	pixel = format.ARGBToColor(255, 0, 255, 0);
+	surface->fillRect(r, pixel);
+	r.left += barW;
+	r.right += barW;
+	pixel = format.ARGBToColor(255, 0, 0, 255);
+	surface->fillRect(r, pixel);
+	r.left += barW;
+	r.right += barW;
+	pixel = format.ARGBToColor(128, 0, 0, 0);
+	surface->fillRect(r, pixel);
+	return surface;
+}
+
 void Playground3dEngine::drawAndRotateCube() {
 	Math::Vector3d pos = Math::Vector3d(0.0f, 0.0f, 6.0f);
 	_gfx->drawCube(pos, Math::Vector3d(_rotateAngleX, _rotateAngleY, _rotateAngleZ));
@@ -148,6 +187,10 @@ void Playground3dEngine::drawInViewport() {
 	_gfx->drawInViewport();
 }
 
+void Playground3dEngine::drawRgbaTexture() {
+	_gfx->drawRgbaTexture();
+}
+
 void Playground3dEngine::drawFrame(int testId) {
 	_gfx->clear(_clearColor);
 
@@ -173,6 +216,11 @@ void Playground3dEngine::drawFrame(int testId) {
 			_gfx->setupViewport(vp.left + 40, _system->getHeight() - vp.top - vp.height() + 40, vp.width() - 80, vp.height() - 80);
 			drawInViewport();
 			break;
+		case 5:
+			_gfx->loadTextureRGBA(_rgbaTexture);
+			_gfx->loadTextureRGB(_rgbTexture);
+			drawRgbaTexture();
+			break;
 		default:
 			assert(false);
 	}
diff --git a/engines/playground3d/playground3d.h b/engines/playground3d/playground3d.h
index 12af51b5fb..13667860d2 100644
--- a/engines/playground3d/playground3d.h
+++ b/engines/playground3d/playground3d.h
@@ -53,13 +53,17 @@ private:
 	Math::Vector4d _clearColor;
 	float _fade;
 	bool _fadeIn;
+	Graphics::Surface *_rgbaTexture;
+	Graphics::Surface *_rgbTexture;
 
 	float _rotateAngleX, _rotateAngleY, _rotateAngleZ;
 
+	Graphics::Surface *generateRgbaTexture(int width, int height, Graphics::PixelFormat format);
 	void drawAndRotateCube();
 	void drawPolyOffsetTest();
 	void dimRegionInOut();
 	void drawInViewport();
+	void drawRgbaTexture();
 };
 
 } // End of namespace Playground3d
diff --git a/engines/playground3d/shaders/playground3d_bitmap.fragment b/engines/playground3d/shaders/playground3d_bitmap.fragment
new file mode 100644
index 0000000000..ac293f3685
--- /dev/null
+++ b/engines/playground3d/shaders/playground3d_bitmap.fragment
@@ -0,0 +1,9 @@
+in vec2 Texcoord;
+
+OUTPUT
+
+uniform sampler2D tex;
+
+void main() {
+	outColor = texture(tex, Texcoord);
+}
diff --git a/engines/playground3d/shaders/playground3d_bitmap.vertex b/engines/playground3d/shaders/playground3d_bitmap.vertex
new file mode 100644
index 0000000000..d727d1d788
--- /dev/null
+++ b/engines/playground3d/shaders/playground3d_bitmap.vertex
@@ -0,0 +1,11 @@
+in vec2 position;
+in vec2 texcoord;
+
+out vec2 Texcoord;
+
+uniform vec2 offsetXY;
+
+void main() {
+	Texcoord = texcoord;
+	gl_Position = vec4(position + offsetXY, 0.0, 1.0);
+}




More information about the Scummvm-git-logs mailing list