Hi Everyone,
I’m looking for help implementing a feature in my program. I would like to ignore the red color completely ( 255 , 0, 0) and replace it with alpha. I have found a tutorial Online this one:
Link to tutorial
The program runs but it does not ignore the red color.
I have made 2 test png.
I render them on each other so the left side of the “2.png” should be invisible and I would see the half of the “1.png”
main.cpp
#include <stdio.h>
#include <iostream>
#include <SDL2/SDL.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_image.h>
#include <SDL_opengles2.h>
// ./configure --disable-video-mir
const GLchar* vertexSource =
"varying vec2 vTexCoord;\n"
"void main(void)\n"
"{\n"
" vTexCoord = gl_MultiTexCoord0.xy;\n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
"}\n";
const GLchar* fragmentSource =
"uniform sampler2D myTexture;\n"
"varying vec2 vTexCoord;\n"
"void main (void)\n"
"{\n"
" vec4 color = texture2D(myTexture, vTexCoord);\n"
" if (color.rgb == vec3(1.0,0.0,0.0))\n"
" discard;\n "
" gl_FragColor = color;\n"
"}\n";
void printShaderLog( GLuint shader )
{
if( glIsShader( shader ) )
{
int infoLogLength = 0;
int maxLength = infoLogLength;
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &maxLength );
char* infoLog = new char[ maxLength ];
glGetShaderInfoLog( shader, maxLength, &infoLogLength, infoLog );
if( infoLogLength > 0 )
{ //Print Log
printf( "%s\n", infoLog );
} //Deallocate string
delete[] infoLog;
} else
{
printf( "Name %d is not a shader\n", shader );
}
}
int main()
{
if (SDL_Init(SDL_INIT_VIDEO)<0)
{
printf("SDL ERROR:%s\n",SDL_GetError());
}
int numdrivers = SDL_GetNumRenderDrivers ();
std::cout << "Render driver count: " << numdrivers << std::endl;
for (int i=0; i<numdrivers; i++)
{
SDL_RendererInfo drinfo;
SDL_GetRenderDriverInfo (0, &drinfo);
std::cout << "Driver name ("<<i<<"): " << drinfo.name << std::endl;
if (drinfo.flags & SDL_RENDERER_SOFTWARE) std::cout << "the renderer is a software fallback" << std::endl;
if (drinfo.flags & SDL_RENDERER_ACCELERATED) std::cout << "the renderer uses hardware acceleration" << std::endl;
if (drinfo.flags & SDL_RENDERER_PRESENTVSYNC) std::cout << "present is synchronized with the refresh rate" << std::endl;
if (drinfo.flags & SDL_RENDERER_TARGETTEXTURE) std::cout << "the renderer supports rendering to texture" << std::endl;
}
SDL_Window *SCREEN = SDL_CreateWindow("Screen",0,0,320,240,SDL_WINDOW_OPENGL);
if (SCREEN == NULL)
{
printf("SDL WINDOW:%s\n",SDL_GetError());
}
SDL_Renderer* RENDER = SDL_CreateRenderer(SCREEN,-1,SDL_RENDERER_ACCELERATED|SDL_RENDERER_PRESENTVSYNC);
if (RENDER == NULL)
{
printf("SDL RENDERER:%s\n",SDL_GetError());
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
SDL_GL_SetSwapInterval(0);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_CreateContext(SCREEN);
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
GLint vCompiled = GL_FALSE;
glGetShaderiv( vertexShader, GL_COMPILE_STATUS, &vCompiled );
if( vCompiled != GL_TRUE )
{
printf( "Unable to compile vertex shader %d!\n", vertexShader );
printShaderLog( vertexShader );
return false;
}
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
vCompiled = GL_FALSE;
glGetShaderiv( fragmentShader, GL_COMPILE_STATUS, &vCompiled );
if( vCompiled != GL_TRUE )
{
printf( "Unable to compile fragment shader %d!\n", fragmentShader );
printShaderLog( fragmentShader );
return false;
}
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
SDL_Texture *img1 = NULL;
SDL_Texture *img2 = NULL;
img1 = IMG_LoadTexture(RENDER, "1.png");
img2 = IMG_LoadTexture(RENDER, "2.png");
SDL_Rect texr;
texr.x = 0;
texr.y = 0;
texr.w = 320;
texr.h = 240;
int i = 100;
while (i > 0)
{
SDL_Event e;
while (SDL_PollEvent(&e)) {}
SDL_RenderClear(RENDER);
SDL_Delay(3);
SDL_RenderCopy(RENDER, img1, NULL, &texr);
SDL_RenderCopy(RENDER, img2, NULL, &texr);
//SDL_RenderPresent(RENDER);
SDL_GL_SwapWindow(SCREEN);
i--;
}
SDL_DestroyRenderer(RENDER);
SDL_DestroyWindow(SCREEN);
SDL_Quit();
}
Makefile:
SDL_CXXFLAGS := $(shell sdl2-config --cflags)
SDL_LDFLAGS := $(shell sdl2-config --libs)
CXX ?= g++
CXXFLAGS += -Wno-write-strings -g $(SDL_CXXFLAGS)
LDFLAGS := $(SDL_LDFLAGS) -lEGL -lGLESv2 -lSDL2_ttf -lSDL2_image -lSDL2_gfx
MAKEFLAGS := -j4
all : videotest
OBJS := main.o
videotest : $(OBJS)
$(CXX) -o videotest $(OBJS) $(LDFLAGS)
$(OBJS) : %.o : %.cpp
$(CXX) $(CXXFLAGS) -o $@ -c $<
clean:
rm -f $(OBJS) videotest
I’m using SDL2 2.0.5 and Ubuntu 17.04
I’m looking forward to your answers
Many thanks