From ab627b5ef56591f76212d93da2c336d6ccc3a4d0 Mon Sep 17 00:00:00 2001 From: T_chan Date: Mon, 31 Jan 2022 10:04:50 +0000 Subject: [PATCH] merge of blend_test and lerabot_blend_test, addition of 1 case, and... --- CMakeLists.txt | 1 - samples/blend_test/main.c | 52 +++++-- samples/lerabot_blend_test/main.c | 130 ------------------ .../lerabot_blend_test/romdisk/PLACEHOLDER | 0 4 files changed, 40 insertions(+), 143 deletions(-) delete mode 100644 samples/lerabot_blend_test/main.c delete mode 100644 samples/lerabot_blend_test/romdisk/PLACEHOLDER diff --git a/CMakeLists.txt b/CMakeLists.txt index e534520..d25f484 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,7 +124,6 @@ gen_sample(depth_funcs samples/depth_funcs/main.c) gen_sample(depth_funcs_alpha_testing samples/depth_funcs_alpha_testing/main.c samples/depth_funcs_alpha_testing/gl_png.c) gen_sample(depth_funcs_ortho samples/depth_funcs_ortho/main.c) gen_sample(lerabot01 samples/lerabot01/main.c) -gen_sample(lerabot_blend_test samples/lerabot_blend_test/main.c) gen_sample(lights samples/lights/main.c) gen_sample(mipmap samples/mipmap/main.c) gen_sample(multitexture_arrays samples/multitexture_arrays/main.c samples/multitexture_arrays/pvr-texture.c) diff --git a/samples/blend_test/main.c b/samples/blend_test/main.c index cd47cc6..6fbb795 100644 --- a/samples/blend_test/main.c +++ b/samples/blend_test/main.c @@ -1,7 +1,8 @@ /* - * This sample is to demonstrate a bug where rendering an unblended - * polygon, before a series of blended ones would result in no blended - * output and incorrect depth testing + * This sample demonstrates blending, and the importance of drawing order, + * depth testing and z-value. + * This is a merge of lerabot_blend_test and blend_test, with 1 added case, + * and with adapted/corrected explanation */ #ifdef __DREAMCAST__ @@ -82,13 +83,13 @@ void DrawGLScene() const float NONE [] = {0, 0, 0, 0}; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer + + // LEFT UPPER SECTION glLoadIdentity(); // Reset The View - - glTranslatef(-4.0, 0, -10); - - // LEFT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section draw both quad at the same Z value + glTranslatef(-4.0, 2.0, -10); + // This draws 2 quads, a red first, then an overlapping blue one. + // Both quads are drawn at the SAME z-value + // With depth test GL_LEQUAL, this means blending for the overlapping part glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(RED); @@ -96,11 +97,24 @@ void DrawGLScene() DrawQuad(BLUE); glDisable(GL_BLEND); + // RIGHT UPPER SECTION glTranslatef(4.0, 0, 0); + // This draws 2 quads, a red first, then an overlapping blue one. + // The blue quad has a LOWER z-value, so it is behind the red quad. + // With depth test GL_LEQUAL, the blue part is not considered for the overlapping part, so no blending + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + DrawQuad(RED); + glTranslatef(1.0, 0, -0.01); + DrawQuad(BLUE); + glDisable(GL_BLEND); - // RIGHT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section uses a HIGHER Z VALUE(0.01f), so the blue quad should be in FRONT of the red quad. + // LEFT DOWN SECTION + glLoadIdentity(); // Reset The View + glTranslatef(-4.0, -1.0, -10); + // This draws 2 quads, a red first, then an overlapping blue one. + // The blue quad has a HIGHER z-value, so it is in front the red quad. + // With depth test GL_LEQUAL, this means blending for the overlapping part glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); DrawQuad(RED); @@ -108,6 +122,20 @@ void DrawGLScene() DrawQuad(BLUE); glDisable(GL_BLEND); + // RIGHT DOWN SECTION + glTranslatef(4.0, 0.0, -0.01); + // This is basically the same as the RIGHT UPPER SECTION, except that the blue quad + // is drawn first. + // With depth test GL_LEQUAL, this means blending for the overlapping part + // <- the order of drawing is important for blending ! + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glTranslatef(1.0, 0.0, -0.01); + DrawQuad(BLUE); + glTranslatef(-1.0, 0.0, 0.01); + DrawQuad(RED); + glDisable(GL_BLEND); + glKosSwapBuffers(); } diff --git a/samples/lerabot_blend_test/main.c b/samples/lerabot_blend_test/main.c deleted file mode 100644 index fdc21d1..0000000 --- a/samples/lerabot_blend_test/main.c +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This sample is to demonstrate a bug where rendering an unblended - * polygon, before a series of blended ones would result in no blended - * output and incorrect depth testing - */ - -#ifdef __DREAMCAST__ -#include -#endif - -#include "GL/gl.h" -#include "GL/glu.h" -#include "GL/glkos.h" - -/* A general OpenGL initialization function. Sets all of the initial parameters. */ -void InitGL(int Width, int Height) // We call this right after our OpenGL window is created. -{ - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // This Will Clear The Background Color To Black - glClearDepth(1.0); // Enables Clearing Of The Depth Buffer - glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glEnable(GL_TEXTURE_2D); - glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading - glDisable(GL_BLEND); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); // Reset The Projection Matrix - - gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); // Calculate The Aspect Ratio Of The Window - - glMatrixMode(GL_MODELVIEW); -} - -/* The function called when our window is resized (which shouldn't happen, because we're fullscreen) */ -void ReSizeGLScene(int Width, int Height) -{ - if (Height == 0) // Prevent A Divide By Zero If The Window Is Too Small - Height = 1; - - glViewport(0, 0, Width, Height); // Reset The Current Viewport And Perspective Transformation - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - - gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f); - glMatrixMode(GL_MODELVIEW); -} - -int check_start() { -#ifdef __DREAMCAST__ - maple_device_t *cont; - cont_state_t *state; - - cont = maple_enum_type(0, MAPLE_FUNC_CONTROLLER); - - if(cont) { - state = (cont_state_t *)maple_dev_status(cont); - - if(state) - return state->buttons & CONT_START; - } -#endif - - return 0; -} - -void DrawQuad(const float* colour) { - glBegin(GL_QUADS); - glColor4fv(colour); - glVertex3f(-1.0,-1.0, 0.0); - glVertex3f( 1.0,-1.0, 0.0); - glVertex3f( 1.0, 1.0, 0.0); - glVertex3f(-1.0, 1.0, 0.0); - glEnd(); -} - -/* The main drawing function. */ -void DrawGLScene() -{ - const float RED [] = {1.0, 0, 0, 0.5}; - const float BLUE [] = {0.0, 0, 1, 0.5}; - const float NONE [] = {0, 0, 0, 0}; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer - glLoadIdentity(); // Reset The View - - glTranslatef(-4.0, 0, -10); - - // LEFT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section draw both quad at the same Z value - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - DrawQuad(RED); - glTranslatef(1.0, 0, 0); - DrawQuad(BLUE); - glDisable(GL_BLEND); - - glTranslatef(4.0, 0, 0); - - // RIGHT SECTION - // This should draw 2 quad, a red first, then and overlapping blue one. - // This section uses a LOWER Z VALUE(-0.01f), so the blue quad should be in FRONT of the red quad. - // lerabot's note : changing the z value to positive gives the desired output. - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - DrawQuad(RED); - glTranslatef(1.0, 0, -0.01); - DrawQuad(BLUE); - glDisable(GL_BLEND); - - glKosSwapBuffers(); -} - -int main(int argc, char **argv) -{ - glKosInit(); - - InitGL(640, 480); - ReSizeGLScene(640, 480); - - while(1) { - if(check_start()) - break; - - DrawGLScene(); - } - - return 0; -} diff --git a/samples/lerabot_blend_test/romdisk/PLACEHOLDER b/samples/lerabot_blend_test/romdisk/PLACEHOLDER deleted file mode 100644 index e69de29..0000000