英文:
opengl es how to set boolean in shader
问题
我想在我的片段着色器中设置布尔值,因为我需要通过乘法识别何时对物体上色,但我不知道如何从Java代码访问这个名为textured的布尔变量。项目在Java中为Android创建,使用OpenGL ES 3.0。
precision mediump float;
uniform vec4 vColor;
uniform bool textured;
uniform sampler2D uTexture;
varying vec2 vTexCoordinate;
void main(){
if(textured){
gl_FragColor = texture2D(uTexture, vTexCoordinate);
gl_FragColor *= vColor;
} else {
gl_FragColor = vColor;
}
}
英文:
I want to set boolean value in my fragment shader beacuse i need to recognize when to color objects by multiplying. but i dont know how to acess this boolean variable textured from java code. Project is created in java for android, using opengl es 3.0.
precision mediump float;
uniform vec4 vColor;
uniform bool textured;
uniform sampler2D uTexture;
varying vec2 vTexCoordinate;
void main(){
if(textured){
gl_FragColor = texture2D(uTexture, vTexCoordinate);
gl_FragColor *= vColor;
} else {
gl_FragColor = vColor;
}
}
答案1
得分: 2
我建议使用int
而不是bool
:if (textured != 0)
或者您可以传递一个浮点值来加权纹理:
precision mediump float;
uniform vec4 vColor;
uniform float textured;
uniform sampler2D uTexture;
varying vec2 vTexCoordinate;
void main()
{
gl_FragColor =
vColor * mix(vec4(1.0), texture2D(uTexture, vTexCoordinate), textured);
}
mix
在两个值之间线性插值。看表达式:
gl_FragColor =
vColor * mix(vec4(1.0), texture2D(uTexture, vTexCoordinate), textured);
如果 textured == 0.0
,颜色会乘以 vec4(1.0)
:
gl_FragColor = vColor * vec4(1.0);
如果 textured == 1.0
,颜色会乘以从纹理查找返回的颜色:
gl_FragColor = vColor * texture2D(uTexture, vTexCoordinate);
如果 0.0 < textured < 1.0
,则 vec4(1.0)
和纹理颜色会线性插值。
此外,在条件语句中查找纹理时要小心。请参阅OpenGL ES 1.1 完整规范 - 6 纹理访问;第110页:
> 在非均匀条件块的主体内访问多级贴图纹理会产生未定义的值。非均匀条件块是指其执行在编译时无法确定的块。
英文:
I recommend to use an int
rather than a bool
: if (textured != 0)
Alternatively you can pass a floating point value which weights the texture:
precision mediump float;
uniform vec4 vColor;
uniform float textured;
uniform sampler2D uTexture;
varying vec2 vTexCoordinate;
void main()
{
gl_FragColor =
vColor * mix(vec4(1.0), texture2D(uTexture, vTexCoordinate), textured);
}
mix
linearly interpolate between two values. Look at the expression:
gl_FragColor =
vColor * mix(vec4(1.0), texture2D(uTexture, vTexCoordinate), textured);
If textured == 0.0
, the color is multiplied by vec4(1.0)
:
gl_FragColor = vColor * vec4(1.0);
If textured == 1.0
, then the color is multiplied by the color returned from the texture lookup:
gl_FragColor = vColor * texture2D(uTexture, vTexCoordinate);
If 0.0 < textured < 1.0
, then vec4(1.0)
and the texture color are interpolated linearly.
Furthermore be careful when you look up a texture in a condition statement. See OpenGL ES 1.1 Full Specification - 6 Texture Accesses; page 110:
> Accessing mip-mapped textures within the body of a non-uniform conditional block gives an undefined value. A non-uniform conditional block is a block whose execution cannot be determined at compile time.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论