Author Topic: setUniform with int array ?  (Read 4626 times)

Offline MichaelJPCT

  • float
  • ****
  • Posts: 268
    • View Profile
setUniform with int array ?
« on: April 24, 2024, 05:53:52 am »
hello Egon,
it seems that there is no setUniform(string,int[] val). but in java doc of glsl shader there is: uniform int blendingmode[4].
is that right?

another question , can there be uniform short array?
another question , can a uniform array be longer than 1024 elements?

thanks.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12298
    • View Profile
    • http://www.jpct.net
Re: setUniform with int array ?
« Reply #1 on: April 25, 2024, 11:19:36 am »
No, there isn't. I guess, I never saw the need for it so I somehow overlooked it. Do you need support for this?

Internally, it's used (as you've noticed) for setting the blending modes, but that's the only part that uses it.

About the other questions:

  • There's no setter for short-arrays in the API, so I guess not...
  • I'm not limiting this, so I guess it depends on the GPU/driver what the limit is.

Offline MichaelJPCT

  • float
  • ****
  • Posts: 268
    • View Profile
Re: setUniform with int array ?
« Reply #2 on: April 25, 2024, 12:07:51 pm »
i was thinking about more flexibilities of data format.
for example, since 'short' is not possible, i may use 1 int to store 2 short values. i could save some ram in this way.

but now i found a bigger problem:
i can't use bitwise operation in shader(like int&2 ). so i can't use 1 int to store 32 boolean values. and jpct-ae doesn't provide setUniform(string,bool val). i guess i could use 1 int to store 4 booleans by some calculation, but it's not convenient.

can i call GL functions directly so jpct-ae doesn't need to provide all possible signatures of setUniform?

Thanks.

Offline EgonOlsen

  • Administrator
  • quad
  • *****
  • Posts: 12298
    • View Profile
    • http://www.jpct.net
Re: setUniform with int array ?
« Reply #3 on: April 25, 2024, 12:57:15 pm »
Should be doable. You can implement an IRenderHook and attach it to the objects in question. In it, implement the https://www.jpct.net/jpct-ae/doc/com/threed/jpct/IRenderHook.html#setCurrentShader-com.threed.jpct.GLSLShader--method and then do something like:

Code: [Select]
int handle = GLES20.glGetUniformLocation(shader.getProgram(), "your_uniforms_name");
GLES20.glUniform1iv(handle, intArray.length, intArray, 0);

in it...that should work...I guess... ;)

Offline AeroShark333

  • float
  • ****
  • Posts: 320
    • View Profile
Re: setUniform with int array ?
« Reply #4 on: April 25, 2024, 02:41:15 pm »
another question , can there be uniform short array?
You can't specify different integers (byte, short, integer, long, etc.) but you can set the overall integer precision (but this is device specific...).
As of OpenGLES 3.0, you can do more with integers such as bit manipulation. So I could imagine you could store two shorts in a 32-bit integer variable. (idea can be extended to arrays, of course)
You'll need to make sure your renderer supports OpenGLES3.0 and the device also supports it (as well as bit manipulation).

another question , can a uniform array be longer than 1024 elements?
From my experience this is very device specific. Modern devices usually have allow for more than 256 uniform values.
That means that you should take around 240 as your uniform array size limit. (as other uniform variables are also counted for the device limit).

Offline MichaelJPCT

  • float
  • ****
  • Posts: 268
    • View Profile
Re: setUniform with int array ?
« Reply #5 on: April 26, 2024, 03:54:37 pm »
Thanks Egon,
i found that setUniform(float array) can be used to set boolean uniform too, if the uniform in glsl program is written as 'bool'.

to AeroShark333:
i tried gles3.0 and i am quite sure the app was in es3, but i still can't use bitwise operation (shader doesn't compile if '&' is used).
i just used 3 as the argument when calling the setglesclientversion() method.