Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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?

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

  • Author

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.....

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

  • Author

Didn't work, everything stayed opaque. What could be going wrong?

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

  • Author

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?

 

 

Hi

 

Are you perhaps drawing it twice on top of itself, once as opaque, once as transparent?

 

What did you forget in 1st person, as a matter of interest?

 

-TGG

  • Author

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!

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.