Jump to content

Recommended Posts

Posted (edited)

[EDITED]

Question about my "favorite" subject in minecraft, rendering. I wish to use a custom shader on a generated texture that is displayed by a TESR. 

public class RenderTileInscription extends TileEntitySpecialRenderer<TileInscription>{

	@Override
	public void renderTileEntityAt(TileInscription te, double x, double y, double z, float partialTicks,
			int destroyStage) {
		final MagicCircle circle = HandlerModel.getInstance().tester;//this gets an instance of a object that holdes a holds a TextureAtlasSprite
		
		if(circle != null){
			bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
			
			GlStateManager.pushMatrix();
			GlStateManager.disableCull();
			GlStateManager.enableBlend();
			GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
			GlStateManager.disableAlpha();
			GlStateManager.translate(x, y+0.0001f, z);
			GlStateManager.rotate(90f, 1f, 0f, 0f);
			GlStateManager.scale(0.3625f, 0.3625f, 0.3625f);
			
			UtilRender.renderStandQuadTexture(circle.getTextureSprite());//renderQuadTexture metho
			
			GlStateManager.enableAlpha();
			GlStateManager.disableBlend();
			GlStateManager.enableCull();
			GlStateManager.popMatrix();
		}
	}
	
}
////methods from UtilRender//////
public static void renderQuadTexture(TextureAtlasSprite texture, int par1, int par2, int par3, int par4, int brightness){
		Tessellator tes = Tessellator.getInstance();
		tes.getBuffer().begin(GL11.GL_QUADS, ClientProxy.POSITION_TEX_S_COMP);
		tes.getBuffer().pos(par1, par2 + par4, 0).tex(texture.getMinU(), texture.getMaxV()).lightmap(brightness, brightness).endVertex();
		tes.getBuffer().pos(par1 + par3, par2 + par4, 0).tex(texture.getMaxU(), texture.getMaxV()).lightmap(brightness, brightness).endVertex();
		tes.getBuffer().pos(par1 + par3, par2, 0).tex(texture.getMaxU(), texture.getMinV()).lightmap(brightness, brightness).endVertex();
		tes.getBuffer().pos(par1, par2, 0).tex(texture.getMinU(), texture.getMinV()).lightmap(brightness, brightness).endVertex();
		tes.draw();
}
  
public static void renderStandQuadTexture(TextureAtlasSprite texture, int brightness){	
  	renderQuadTexture(texture, 0, 0, 16, 16, brightness);
}
public static void renderStandQuadTexture(TextureAtlasSprite texture){
	renderQuadTexture(texture, 0, 0, 16, 16, 240);
}

The above code will display the correct drawn texture (made larger than a standard block for ease of sight), now the question is how to implement custom shaders. The specific shading effect I am looking to make is where an EntityPlayer instance will activate (right click) the block, that will send the information of the specified held item and the exact position relative to the bounding box where the player clicked. This will then be used by the TESR so as to display the predefined texture (the circle.getTextureSprite() part) with a "light" source of a specific color, with source position (starting point) being at the point where the player originally right clicked the block. This color will then gradually fade (like a light) over a specific area. To summarize, I wish to use a shader to create a gradual light fate effect, with passed in vars of a color (vec3 or 4), and a position relative to the texture (vec2) (these variables being provided via uniforms to a fragment shader). This should look (of better quality) like the transition (from the attached pictures) of pic1 -> pic2. Needless to say, compatible for multiple "light" sources.

 

Now from what I understand, I don't believe I need to use a vertex shader, and only a fragment shader. More so, I really don't think I need anything overly fancy, and while in non-minecraft opengl, I would use a normal mapping, for this, I would prefer to not, as the base picture should be uniform color (more or less), and I am only looking for a simple lighting overlay, not any ultra-realism. 

 

Thus, thats more or less my question: how do I do this form of effect within minecraft, preferably in a relatively simple fashion. 

 

 

state0.png pic1

state1.pngpic2

state2.pngpic3

Edited by draganz
make easier for one to read
Posted
22 hours ago, draganz said:

Question relating toward implementation within minecraft (forge). How does one go about this: I wish to have a texture (lets say a white square) that will be rendered via a TESR; lets say it looks like this (I do hope this posts correctly):

 

(p1)                 (p2)                       (p3)

      XooooooooooXoooooooooooX

      oooooooooooooooooooooooo

(p4)XoooooooooUooooooooooooX (p5)

      oooooooooooooooooooooooo 

      XoooooooooXooooooooooooX

(p6)                (p7)                          (p8)

, with the center being "U," and different points being labeled p(n) and designated with "X." So lets begin: I wish to have say p2 render (like a light) of red from its point to (creating like a  gradually fading triangle) from p1, p3, and U. This looking like (with "R being a strong red color, and "r" being a lighter, use your imagination for the gradual fading from strong to weak):

 

(p1)                 (p2)                       (p3)

      Xo rrrrrRRRRXRRRRrrrrrrrrr oX

      oooo rrrrRRRRRRRrrrr oooooo

(p4)XoooooooooUooooooooooooX (p5)

      oooooooooooooooooooooooo 

      XoooooooooXooooooooooooX

(p6)                (p7)                          (p8)

 

With p2 having the strongest point of red, and the outer "r" points being near white, needless to say, other p(n) points remaining white as well (non coloring) ; from there, it should also be possible to do the like with other colors and also using the same implementation for the remaining points on the texture, to create similar effects. How to do this is known for me going from scratch (no from within a mod in Minecraft; and as aside note, so do I know how to change the entire textures color (at once)); my question being more on the line of how to do specific vector (color) shadings on the texture, prefereably via minecrafts implementations, should it be possible.

 

example in picture format as follows (beginning texture [state0.png] => after first point shading [state1.png] => further implementation [state2.png]):

state0.png

state1.png

state2.png

Can you explain what you are trying to do? You give examples of what you have in mind, but nothing truly explaining what it is you want to do in the TESR. Rendering something through a TESR is easy if you know what you are doing, but we are gonna need a little more info about what it is you are trying to do before we can help.

Posted
On 6/1/2017 at 9:42 PM, draganz said:

I wish to use a custom shader on a generated texture that is displayed by a TESR. 

If you want to use a GLSL shader... use a GLSL shader. There is nothing stopping you. The game uses OpenGL after all and all normal GL calls are available to you. Load your shader, compile it, link to a shader program, delete the shader, bind the program, upload your data, render and you are done. Yes, you are absolutely free to use modern OpenGL(by that I mean ~<=3.3) with buffers and stuff, MC somewhat uses them already and If I recall correctly the game even requires GL3.0+ support to launch. Yes it is going to be a pain to implement with vanilla provided Tessellator's VertexBuffer as the way it uploads data is... weird. Yes, you can allocate your own buffer, put stuff in, bind and render, just like you would do for normal gl rendering. If you want more specific details you should browse lwjgl's tutorials and wiki as MC uses lwjgl.

Note that there is no guarantee that other mods will not mess stuff up(thinking about the shadersmod for example) so you should be as cautious as possible and not forget to reset all GL states and binds after you are done.

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • You will find the crash-report or log in your minecraft directory (crash-report or logs folder)
    • Use a modpack which is using these 2 mods as working base:   https://www.curseforge.com/minecraft/modpacks/life-in-the-village-3
    • inicie un mundo donde instale Croptopia y Farmer's Delight, entonces instale el addon Croptopia Delight pero no funciona. es la version 1.18.2
    • Hello all. I'm currently grappling with the updateShape method in a custom class extending Block.  My code currently looks like this: The conditionals in CheckState are there to switch blockstate properties, which is working fine, as it functions correctly every time in getStateForPlacement.  The problem I'm running into is that when I update a state, the blocks seem to call CheckState with the position of the block which was changed updated last.  If I build a wall I can see the same change propagate across. My question thus is this: is updateShape sending its return to the neighbouring block?  Is each block not independently executing the updateShape method, thus inserting its own current position?  The first statement appears to be true, and the second false (each block is not independently executing the method). I have tried to fix this by saving the block's own position to a variable myPos at inception, and then feeding this in as CheckState(myPos) but this causes a worse outcome, where all blocks take the update of the first modified block, rather than just their neighbour.  This raises more questions than it answers, obviously: how is a different instance's variable propagating here?  I also tried changing it so that CheckState did not take a BlockPos, but had myPos built into the body - same problem. I have previously looked at neighbourUpdate and onNeighbourUpdate, but could not find a way to get this to work at all.  One post on here about updatePostPlacement and other methods has proven itself long superceded.  All other sources on the net seem to be out of date. Many thanks in advance for any help you might offer me, it's been several days now of trying to get this work and several weeks of generally trying to get round this roadblock.  - Sandermall
    • sorry, I might be stupid, but how do I open it? because the only options I have are too X out, copy it, which doesn't work and send crash report, which doesn't show it to me, also, sorry for taking so long.
  • Topics

×
×
  • Create New...

Important Information

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