Sign in to follow this  
bmcclint

OpenGL Transparent Texture Maps

Recommended Posts

bmcclint    122
If this is posted before, I apologize and if you could post a link, it would be greatly appreciated… OK…My OpenGL experience is say moderate and I am now diving into more advanced techniques. Now I am trying to render a model of the planet Saturn. I have the model created, I know it a sphere how hard could it be, and the rings, and again a disc I know easy. Actually, I have the whole solar system with skybox, lighting, shading, realistic orbits, sizes and distances so now its time to add a little realism. Transparent rings, atmospheres and glow effects. I have created a smaller scale sample program for testing just this purpose. I have the model rendered and shaded, textured with a surface and a ring texture. The textures are from planet pixel emporium to give credit to the texture creator. Also on the site is a transparency map for the ring. It is an 8-bit transparency map. I would like to apply the transparency map to the rings that are rendered. One to give a more realistic look and two to see the planet behind the rings at certain angles. I have heard of this technique called 8-bit alpha channel but am still not sure if that is the case. From what I gather, it is really noting more than setting up the alpha blend method, disabling the depth buffer and rendering polygons. I have the red book and super bible but nothing stands out. Anyone have a code snippet or lead to an area that may shed some light? Thanks…

Share this post


Link to post
Share on other sites
AndyEsser    394
The easiest thing for you to do would be to take the 24-bit colour map you are using as the ring texture into Photoshop (or other suitable imaging software) and then add the 8-bit alpha image as the Alpha Channel.

Either that, or bind the alpha channel texture and in a shader simply calculate the colour based on that alpha texture.

Share this post


Link to post
Share on other sites
bmcclint    122
I was afraid of that...

I was looking into texture combiners. Is this something I can do say load ring texture into TEXTURE0 and alpha into TEXTURE1 and somehow with these glTexEnv* commands combine the RGB of TEXTURE0 and A of TEXTURE1 then apply that to the filter chain?

BTW...A point to a good tut or texture alpha blending would be appreciated. I am making progress but it is slow going.

Thanks...

Share this post


Link to post
Share on other sites
bmcclint    122
Well progress...I made a png with alpha channel and have been able to get parts of the transparency to work. Next question is, it seems the alpha map is not taking into consideration all the levels. It seems to only be filtering out only the highest levels. Since I am new at this not sure what blending and alpha functions to use. Any suggestions?

Code section showing blend and alpha code/comments...

.
.
.

for(uint j = 0; j < segment->face_count; j++) {
surface_t* surface = &surfaces[face->surface];
if(surface != current_surface) {
glMaterialfv(GL_FRONT, GL_AMBIENT, surface->ambient);
glMaterialfv(GL_FRONT, GL_EMISSION, surface->emissive);
glMaterialfv(GL_FRONT, GL_DIFFUSE, surface->diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, surface->specular);
glMaterialf(GL_FRONT, GL_SHININESS, surface->reflectivity);

//glActiveTexture(GL_TEXTURE0);
set_gl_texture(surface->main_texture);

//glDisable(GL_ALPHA);
glDisable(GL_BLEND);

if(i == 1) { // No alpha map (Temporary until I find a better way to trigger blending in the model)
//if(surface->alpha_texture[0] != 0) { // No alpha map
//glEnable(GL_ALPHA_TEST);
//glEnable(GL_ALPHA);
glEnable(GL_BLEND);
//glAlphaFunc(GL_SRC_ALPHA, 0.2);
glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
current_surface = surface;
}

face_vertex_t* fvert = (face_vertex_t*)&face->fvert_data;
glBegin(GL_TRIANGLES);
for(uint k = 0; k < face->count; k++) {
glNormal3fv((float*)&fvert[k].normal); glTexCoord2fv((float*)&fvert[k].texel); glVertex3fv((float*)&vertexes[fvert[k].index]);
}
glEnd();
face = (face_t*)((uint)face + face->length);
}



.
.
.

Share this post


Link to post
Share on other sites
CTPAX    122
Where's the code where you load your textures? You should have this code in it:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture[0].width, texture[0].height, 0, GL_RGBA, GL_UNSIGNED_BYTE, *pointer);

Share this post


Link to post
Share on other sites
OrangyTang    1298
Unless you've got a very odd effect in mind, you probably want glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) instead of your current blend func.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Similar Content

    • By povilaslt2
      Hello. I'm Programmer who is in search of 2D game project who preferably uses OpenGL and C++. You can see my projects in GitHub. Project genre doesn't matter (except MMO's :D).
    • By ZeldaFan555
      Hello, My name is Matt. I am a programmer. I mostly use Java, but can use C++ and various other languages. I'm looking for someone to partner up with for random projects, preferably using OpenGL, though I'd be open to just about anything. If you're interested you can contact me on Skype or on here, thank you!
      Skype: Mangodoor408
    • By tyhender
      Hello, my name is Mark. I'm hobby programmer. 
      So recently,I thought that it's good idea to find people to create a full 3D engine. I'm looking for people experienced in scripting 3D shaders and implementing physics into engine(game)(we are going to use the React physics engine). 
      And,ye,no money =D I'm just looking for hobbyists that will be proud of their work. If engine(or game) will have financial succes,well,then maybe =D
      Sorry for late replies.
      I mostly give more information when people PM me,but this post is REALLY short,even for me =D
      So here's few more points:
      Engine will use openGL and SDL for graphics. It will use React3D physics library for physics simulation. Engine(most probably,atleast for the first part) won't have graphical fron-end,it will be a framework . I think final engine should be enough to set up an FPS in a couple of minutes. A bit about my self:
      I've been programming for 7 years total. I learned very slowly it as "secondary interesting thing" for like 3 years, but then began to script more seriously.  My primary language is C++,which we are going to use for the engine. Yes,I did 3D graphics with physics simulation before. No, my portfolio isn't very impressive. I'm working on that No,I wasn't employed officially. If anybody need to know more PM me. 
       
    • By Zaphyk
      I am developing my engine using the OpenGL 3.3 compatibility profile. It runs as expected on my NVIDIA card and on my Intel Card however when I tried it on an AMD setup it ran 3 times worse than on the other setups. Could this be a AMD driver thing or is this probably a problem with my OGL code? Could a different code standard create such bad performance?
    • By Kjell Andersson
      I'm trying to get some legacy OpenGL code to run with a shader pipeline,
      The legacy code uses glVertexPointer(), glColorPointer(), glNormalPointer() and glTexCoordPointer() to supply the vertex information.
      I know that it should be using setVertexAttribPointer() etc to clearly define the layout but that is not an option right now since the legacy code can't be modified to that extent.
      I've got a version 330 vertex shader to somewhat work:
      #version 330 uniform mat4 osg_ModelViewProjectionMatrix; uniform mat4 osg_ModelViewMatrix; layout(location = 0) in vec4 Vertex; layout(location = 2) in vec4 Normal; // Velocity layout(location = 3) in vec3 TexCoord; // TODO: is this the right layout location? out VertexData { vec4 color; vec3 velocity; float size; } VertexOut; void main(void) { vec4 p0 = Vertex; vec4 p1 = Vertex + vec4(Normal.x, Normal.y, Normal.z, 0.0f); vec3 velocity = (osg_ModelViewProjectionMatrix * p1 - osg_ModelViewProjectionMatrix * p0).xyz; VertexOut.velocity = velocity; VertexOut.size = TexCoord.y; gl_Position = osg_ModelViewMatrix * Vertex; } What works is the Vertex and Normal information that the legacy C++ OpenGL code seem to provide in layout location 0 and 2. This is fine.
      What I'm not getting to work is the TexCoord information that is supplied by a glTexCoordPointer() call in C++.
      Question:
      What layout location is the old standard pipeline using for glTexCoordPointer()? Or is this undefined?
       
      Side note: I'm trying to get an OpenSceneGraph 3.4.0 particle system to use custom vertex, geometry and fragment shaders for rendering the particles.
  • Popular Now