Jump to content

[1.7.10].setColorRGBA_I alpha setting not working.


Taji34

Recommended Posts

I'm trying to have an Item where part of it renders with transparency, but it continues to render opaque no matter what. This is the snippet of code I'm using to set the color:

if (i == 0)
			{
				tess.setColorOpaque_I(color[i]);
			}
			else
			{
				GL11.glEnable(GL11.GL_BLEND);
				GL11.glDepthMask(false);
				GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
				if (item.stackTagCompound != null)
				{
					double usesLeft = item.stackTagCompound.getInteger("Uses Left");
					double totalUses = item.stackTagCompound.getInteger("Total Uses");
					double percentageLeft = usesLeft/totalUses;
					int alphaLevel = (int) Math.round(255*percentageLeft);
					tess.setColorRGBA_I(color[i], alphaLevel);
				}
			}

Am I missing some OpenGL flags or is something not in the right order?

Link to comment
Share on other sites

Hi

 

The GL11 flags don't take effect until you render something.  The tessellator queues up a list of commands, but doesn't issue them to openGL until you do the draw.

 

So probably what is happening:

 

1) queue some drawing commands to tessellator

2) change your flags to transparent

3) queue some more drawing commands to tessellator

4) change your flags to opaque

5) queue some more drawing commands to tessellator

6) tessellator.draw

 

At the time of the draw (6), your opengl flags are in opaque mode.  So everything queued up in the tessellator is draw as opaque.

 

You need to either issue the draw command after (1), (3), and (5)  (which may not be possible depending on where your render code is), or alternatively draw using OpenGL directly instead of through the tessellator.

 

Alternatively, items can be rendered in passes, so you could render your transparent sections in pass 1 - look at ItemPotion for inspiration...requiresMultipleRenderPasses, hasEffect, getIconFromDamageForRenderPass

 

Your flags look good to me.

 

-TGG

Link to comment
Share on other sites

Well, I'm trying multiple renderPasses, here's my full code for rendering one side of the item:

tess.setNormal(0, 0, 1);
		for (int i = 0; i < iconParts; ++i)
		{
			tess.startDrawingQuads();
			if (i == 0)
			{
				tess.setColorOpaque_I(color[i]);
			}
			else
			{
				GL11.glEnable(GL11.GL_BLEND);
				GL11.glDepthMask(false);
				GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
				if (item.stackTagCompound != null)
				{
					double usesLeft = item.stackTagCompound.getInteger("Uses Left");
					double totalUses = item.stackTagCompound.getInteger("Total Uses");
					double percentageLeft = usesLeft/totalUses;
					int alphaLevel = (int) Math.round(255*percentageLeft);
					tess.setColorRGBA_I(color[i], alphaLevel);
				}
			}
			tess.addVertexWithUV(0, 0, 0, xMax[i], yMax[i]);
			tess.addVertexWithUV(1, 0, 0, xMin[i], yMax[i]);
			tess.addVertexWithUV(1, 1, 0, xMin[i], yMin[i]);
			tess.addVertexWithUV(0, 1, 0, xMax[i], yMin[i]);
			tess.draw();
		}

I don't think it's getting set back to opaque.....

Link to comment
Share on other sites

Hmm that's odd

 

Are you sure the "else" is every being called?

 

Try replacing your if (i==0) {} else {} with the snippet below and seeing if it renders partially opaque

 

GL11.glEnable(GL11.GL_BLEND);
GL11.glDepthMask(false);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
tess.setColorRGBA_I(color[i], 128);

 

-TGG

Link to comment
Share on other sites

Hi

 

I'm running out of ideas, sorry!  :(

What happens if you replace your source image with one that has a partial transparency (i.e. alpha channel of say 0.5)?

 

You could try this utility

https://github.com/TheGreyGhost/SpeedyTools/blob/master/src/main/java/speedytools/common/utilities/OpenGLdebugging.java

It will dump a copy of all the opengl rendering flags

 

--> place OpenGLdebugging.dumpAllIsEnabled() immediately before your tess.draw(), it make give a clue about which one should be enabled but isn't.

 

-TGG

Link to comment
Share on other sites

So, it wasn't working in first person because of something I forgot, but it is staying opaque in the inventory, which it shouldn't be, here is way your debugger prints out:

GL_VERTEX_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Vertex array enable)
GL_NORMAL_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Normal array enable)
GL_COLOR_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (RGBA color array enable)
GL_INDEX_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Color-index array enable)
GL_TEXTURE_COORD_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Texture coordinate array enable)
GL_EDGE_FLAG_ARRAY:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Edge flag array enable)
GL_NORMALIZE:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Current normal normalization on/off)
GL_FOG:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if fog enabled)
GL_LIGHTING:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if lighting is enabled)
GL_COLOR_MATERIAL:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if color tracking is enabled)
GL_LIGHT0:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 0 enabled)
GL_LIGHT1:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 1 enabled)
GL_LIGHT2:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 2 enabled)
GL_LIGHT3:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 3 enabled)
GL_LIGHT4:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 4 enabled)
GL_LIGHT5:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 5 enabled)
GL_LIGHT6:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 6 enabled)
GL_LIGHT7:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if light 7 enabled)
GL_POINT_SMOOTH:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Point antialiasing on)
GL_LINE_SMOOTH:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Line antialiasing on)
GL_LINE_STIPPLE:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Line stipple enable)
GL_CULL_FACE:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon culling enabled)
GL_POLYGON_SMOOTH:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon antialiasing on)
GL_POLYGON_OFFSET_POINT:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon offset enable for GL_POINT mode rasterization)
GL_POLYGON_OFFSET_LINE:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon offset enable for GL_LINE mode rasterization)
GL_POLYGON_OFFSET_FILL:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon offset enable for GL_FILL mode rasterization)
GL_POLYGON_STIPPLE:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Polygon stipple enable)
GL_TEXTURE_1D:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if 1-D texturing enabled )
GL_TEXTURE_2D:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if 2-D texturing enabled )
GL_TEXTURE_GEN_S:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Texgen enabled (x is S, T, R, or Q))
GL_TEXTURE_GEN_T:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Texgen enabled (x is S, T, R, or Q))
GL_TEXTURE_GEN_R:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Texgen enabled (x is S, T, R, or Q))
GL_TEXTURE_GEN_Q:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Texgen enabled (x is S, T, R, or Q))
GL_SCISSOR_TEST:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Scissoring enabled)
GL_ALPHA_TEST:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Alpha test enabled)
GL_STENCIL_TEST:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Stenciling enabled)
GL_DEPTH_TEST:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Depth buffer enabled)
GL_BLEND:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Blending enabled)
GL_DITHER:true[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Dithering enabled)
GL_INDEX_LOGIC_OP:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (Color index logical operation enabled)
GL_COLOR_LOGIC_OP:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (RGBA color logical operation enabled)
GL_AUTO_NORMAL:false[20:57:00] [Client thread/INFO] [sTDOUT]: [com.taji34.troncraft.OpenGLdebugging:dumpAllIsEnabled:294]:  (True if automatic normal generation enabled)

It stays opaque even with a texture that has an alpha channel of .5, any ideas?

 

 

Link to comment
Share on other sites

I forgot to tell it that it should use my renderer for first person rendering. And I don't think it's rendering multiple times. I'll take a look at that, but I've decided to not do the transparency, it doesn't look right at the moment and I have more important parts of my mod to work on. Thanks for all your help though!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.