gpt4 book ai didi

android - 可以为着色器统一设置初始值吗? (安卓,OpenGL ES 2.0)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:45 27 4
gpt4 key购买 nike

编辑:正如建议的那样,我试图在我的构造函数中为我的着色器统一设置一个“初始”值,我已经包含了一些代码,如果有人能解释我为什么得到,我将不胜感激如果我通过我的构造函数传递值,则会出现空白屏幕 - 谢谢

加载纹理的方法

public void setTexture(GLSurfaceView view, Bitmap imgTexture) {
this.imgTexture=imgTexture;
iProgId = Utils.LoadProgram(strVShader, strFShader);
iBaseMap = GLES20.glGetUniformLocation(iProgId, "u_baseMap");
iPosition = GLES20.glGetAttribLocation(iProgId, "a_position");
iTexCoords = GLES20.glGetAttribLocation(iProgId, "a_texCoords");
texID = Utils.LoadTexture(view, imgTexture);

//Everything is working if I include the lines as part of my setTexture() method
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, 1.0f);
}

但是如果我把它们放在我的构造函数中,什么也没有......

public Quad() {
//iProgId = Utils.LoadProgram(strVShader, strFShader); //I've tried with and without this line - I can confirm that loading / linking is working OK
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, 1.0f);
}

我实际上已经将我的整个纹理加载例程复制到我的构造函数中,并在创建四边形时将相关参数传递给它,但我仍然什么都没有,除非我在构造函数运行后的某个时间设置值!

我有一个 fragment 着色器如下:

String strFShader =
"precision mediump float;" +
"uniform float opValue;"+
"varying vec2 v_texCoords;" +
"uniform sampler2D u_baseMap;" +
"void main()" +
"{" +
"gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
"gl_FragColor *= opValue;"+
"}";

当我创建对象(四边形)时,我有一种方法可以像这样设置所述四边形的不透明度:

public void setOpacity(float op) {  
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, op);
}

但是,如果我想让我的 sprite(quad) 具有一定程度的透明度,我只想运行我的 setOpacity 方法。如果我不指定不透明度级别(即如果我不运行 setOpacity 方法),我希望它使用默认值或“初始”值(显然我希望它是 1.0 的 float )。

这有可能吗?

最佳答案

您不能在着色器中使用某种uniform opValue = 1.0; 来初始化 uniform ,如果这就是您的意思。即使可以,它也不会给你带来太多好处,因为统一值在程序使用中是持久的。这意味着如果您激活另一个程序(使用 glUseProgram)然后重新绑定(bind)该程序,uniform 仍将具有您上次设置的值。因此,您可以在链接程序后立即将 uniform 设置为某个初始值,但是一旦您将其更改为某些透明 Sprite ,它就会永远失去该值。

它甚至不会在单个程序使用期间工作,因为甚至不止于此统一值在绘制调用中保持不变。想想看,如果你写了

draw_opaque_sprite();

setOpacity(0.5f);
draw_transparent_sprite();

draw_opaque_sprite();

程序如何知道您要在绘制透明 Sprite 后将不透明度重置为某个默认值。当然,要求应用程序为每个绘制调用设置所有 uniform 是不可行的。

因此您无法为每个 Sprite 正确设置 uniform 。在这种情况下,通常的优化是根据渲染状态(在您的情况下是不透明度,但可能其他一些状态更重,如纹理等)对对象进行排序,以减少状态变化(如着色器变化、纹理绑定(bind),或者在这种情况下统一更新)尽可能多。

关于android - 可以为着色器统一设置初始值吗? (安卓,OpenGL ES 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15954715/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com