I am loading a BMP image to opengl as a texture and the image is an 32 bit 4 channel per pixel set of data in the format BGRA
it loads in my window, but the Alpha channel not really doing anything because when i change the background colour with glClearColor background remains black , the parts that are normally transparent in the original image(which i posted a link to below) are black in opengl and no matter what background i set remain black always
here is my program if somebody can advise what am i missing
const char* vertex_shader =
"#version 330 core
"
"layout(location = 0) in vec2 vp;"
"layout(location = 1) in vec2 tex;"
"uniform vec2 disp;"
"out vec2 texCoord;"
"void main () {"
" texCoord = tex; "
" vec4 correct = vec4 (vp+disp, 0.0f, 1.0f);"
" gl_Position = correct;"
"}";
const char* fragment_shader =
"#version 330 core
"
"uniform sampler2D s;"
"uniform vec2 displace;"
"in vec2 texCoord;"
"out vec4 color;"
"void main () {"
"vec2 texFix;"
"texFix = texCoord + displace;"
"color = texture(s, texFix);"
"}";
GLuint vs;
GLuint fs;
GLuint shader_program;
void createShaders(){
GLint result;
GLsizei log_length;
GLchar data[255];
GLchar data2[255];
vs = glCreateShader (GL_VERTEX_SHADER);
glShaderSource (vs, 1, &vertex_shader, NULL);
glCompileShader (vs);
glGetShaderiv(vs, GL_COMPILE_STATUS,&result);
if(result == GL_FALSE){
glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &log_length);
glGetShaderInfoLog(vs, log_length, NULL, data );
printf("vertex shader %s
", data);
}
fs = glCreateShader (GL_FRAGMENT_SHADER);
glShaderSource (fs, 1, &fragment_shader, NULL);
glCompileShader (fs);
glGetShaderiv(fs, GL_COMPILE_STATUS,&result);
if(result == GL_FALSE){
glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &log_length);
glGetShaderInfoLog(fs, log_length, NULL, data2 );
printf("fragment shader %s
", data2);
}
shader_program = glCreateProgram ();
glAttachShader (shader_program, fs);
glAttachShader (shader_program, vs);
glLinkProgram (shader_program);
glUseProgram (shader_program);
}
//create Texture object from image and load data into graphics memory
GLuint createTexture(const char * name){
//read pixel data into array from image
unsigned char header[2];
unsigned int startData;
unsigned int width;
unsigned int height;
FILE *file = fopen(name, "rb");
if(!file){printf("Failed to open
"); return 0;}
fread(header, 1, 2, file);
if(header[0]!= 'B' && header[1] != 'M'){
printf("file not read as BMP, header incorrect...exiting
");
exit(0);
}
///moves past irrelevant data
fseek(file,8,SEEK_CUR);
//read pixel data offset starting position
fread(&startData, 1, 4, file);
//skip DIB header
fseek(file, 4, SEEK_CUR);
//read image width and height
fread(&width, 1, 4, file);
fread(&height, 1, 4, file);
unsigned int imageSize = width*height*4;
//set position to start of data
fseek(file, startData, SEEK_SET);
unsigned char * data = (unsigned char *)malloc(imageSize);
fread(data, 1, imageSize, file );
fclose(file);
//create texture object and upload data
GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
//glTexStorage2D(GL_TEXTURE_2D, 7, GL_RGB, width, height);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA,
GL_UNSIGNED_BYTE, data);
//glGenerateMipmap(GL_TEXTURE_2D); //Generate num_mipmaps number of mipmaps here.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
free(data);
return tex;
}
GLuint createVao(){
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
return vao;
}
GLuint createVbo(){
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
return vbo;
}
void bindObject(GLuint vao, GLuint tex){
glBindTexture(GL_TEXTURE_2D, tex);
glBindVertexArray(vao);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <GL/glew.h>
#include <GL/glx.h>
#include <time.h>
#include <math.h>
#include "glx2.c"
#include "testing.hpp"
#include "new.hpp"
#define WIDTH 1080
#define HEIGHT 720
int main(){
init(WIDTH,HEIGHT);
createShaders();
glEnable(GL_LIGHTING);
GLuint disp = glGetUniformLocation(shader_program, "disp");
GLuint disp2 = glGetUniformLocation(shader_program, "displace");
char name[1][25];
strcpy(name[0],"ugly.bmp");
//glViewport(0,0, WIDTH,HEIGHT);
////-----------------------------create VAO and VBO and upload all the relevant vertices and information
GLfloat vertices[] = {
-1.0, -1.0, 0.0, 0.0,
1.0, -1.0, 1.0, 0.0,
-1.0, 1.0, 0.0, 1.0,
1.0, 1.0, 1.0, 1.0};
GLuint vao1 = createVao();
GLuint vbo1 = createVbo();
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint tex = createTexture(name[0]);
//set up data format and save in vao
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), 0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (const GLvoid*)(2 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
int running =1;
XEvent event;
KeySym key;
float value;
float value2=0.0f;
while(running){
while(XPending(dpy)){
XNextEvent(dpy, &event);
switch(event.type){
case KeyPress:
XLookupString(&event.xkey, NULL, 1, &key, NULL);
//printf("%c
",string);
switch(key){
//letter 'q'
case 0x0071:
running = 0;
break;
}
break;
}
}
// red green blue alpha
glClearColor(0.0f,0.0f,1.0f,0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glXSwapBuffers(dpy, glxWin);
}//end of while running loop
glXMakeCurrent( dpy, 0, 0 );
glXDestroyContext( dpy, ctx );
glXDestroyWindow(dpy, glxWin);
XDestroyWindow( dpy, win );
XFreeColormap( dpy, cmap );
XCloseDisplay( dpy );
return 0;
}
and here is the original image (it is originally bmp but gets converted to png when i upload it to postimg, you can convert it back to bmp in linux with mogrify -format bmp *.png if you want to test for yourself)
https://postimg.org/image/pxg6wvv2f/
and here is what i get when i load it in opengl
https://postimg.org/image/onnsgy7zl/
so when i load it in openGL iget no transparency even when i change background color with glClearColor(0.0f,0.0f,1.0f,0.0f);