小编mur*_*rgo的帖子

如何创建多个停止渐变片段着色器?

我正在尝试创建一个OpenGL ES 2.0片段着色器,它沿一个轴输出多个停止渐变.它应该在以百分比定义的点处在多种颜色之间进行插值.

我通过使用if片段着色器实现了这一点,如下所示:

float y = gl_FragCoord.y;
float step1 = resolution.y * 0.20;
float step2 = resolution.y * 0.50;

if (y < step1) {
    color = white;
} else if (y < step2) {
    float x = smoothstep(step1, step2, y);
    color = mix(white, red, x);
} else {
    float x = smoothstep(step2, resolution.y, y);
    color = mix(red, green, x);
}
Run Code Online (Sandbox Code Playgroud)

他们说片段着色器中的分支会破坏性能.是否有一些聪明的技巧可用于在不使用ifs的情况下在多个值之间进行插值?它真的值得(这是非常主观的,我知道,但作为经验法则)?

为了说明我的问题,请参阅此GLSL Sandbox链接中的完整源代码(尽管仍然很短):http://glsl.heroku.com/e#8035.0

interpolation gradient opengl-es glsl opengl-es-2.0

10
推荐指数
1
解决办法
4649
查看次数

使用varargs和泛型时出现ClassCastException

我正在使用java泛型和varargs.

如果我使用下面的代码,我会得到一个ClassCastException,即使我根本不使用强制转换.

更奇怪的是,如果我在Android上运行它(dalvik),异常中不包含堆栈跟踪,如果我将接口更改为抽象类,则异常变量e为空.

代码:

public class GenericsTest {
    public class Task<T> {
        public void doStuff(T param, Callback<T> callback) {
            // This gets called, param is String "importantStuff"

            // Working workaround:
            //T[] arr = (T[]) Array.newInstance(param.getClass(), 1);
            //arr[0] = param;
            //callback.stuffDone(arr);

            // WARNING: Type safety: A generic array of T is created for a varargs parameter
            callback.stuffDone(param);
        }
    }

    public interface Callback<T> {
        // WARNING: Type safety: Potential heap pollution via varargs parameter params
        public void stuffDone(T... …
Run Code Online (Sandbox Code Playgroud)

java generics android variadic-functions classcastexception

5
推荐指数
1
解决办法
2350
查看次数