开发者

Updating information from the vertex shader

开发者 https://www.devze.com 2023-03-01 03:32 出处:网络
In the vertex shader program of a WebGL application, I am doing the 开发者_JAVA技巧following: Calculate gl_Position P using a function f(t) that varies in time.

In the vertex shader program of a WebGL application, I am doing the 开发者_JAVA技巧following:

Calculate gl_Position P using a function f(t) that varies in time.

My question is:

Is it possible to store the updated P(t) computed in the vertex shader so I can use it in the next time step? This will be useful for performing some boundary tests.

I have read some information on how textures can be used to store and updated vextex positions, but is this feasible in WebGL, since even texture access from a vertex program is unsupported in OpenGL ES 1.0?

For a more concrete example, let us say that we are trying to move a point according to the equation R(t) = (k*t, 0, 0). These positions are updated in the vertex shader, which makes the point move. Now if I want to make the point bounce at the wall located at R = (C, 0, 0). To do that, we need the position of the point at t - dt. (previous time step).

Any ideas appreciated.

Regards


In addition to the previous answers, you can circumvent vertex texture fetch by PBOs, but I do not know, if they are supported in WebGL or GLES, as I have only desktop GL experience. You write the vertex positions into the framebuffer. But then, instead of using these as vertex texture, you copy them into a vertex buffer (which works best via PBOs) and use them as a usual vertex attribute. That's the old way of doing transform feedback, which I suppose is not supported.


There's no way to store anything in the vertex shader. You can only pass values from it to the fragment shader and write those to the framebuffer pixels. And as you said, vertex texture fetch isn't universally supported (for instance, ANGLE started supporting it only a few days ago), so even that is a bit unworkable.

You can do two things: either do all the position math in JS and pass in the p1 and p0 as uniforms. Or keep track of the previous time value and do the position math twice in the shader, both for t1 and t0 (shouldn't have much of a performance impact unless you're vertex shader -bound).


Is your dt a constant? if so you could retrieve the previous position for your point by evaluating

R(t-dt). If it is not a constant then you could use a uniform to pass it along on every rendering cycle.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号