Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL:为着色器创建代理用户_Java_Shader_Opengl 2.0 - Fatal编程技术网

Java OpenGL:为着色器创建代理用户

Java OpenGL:为着色器创建代理用户,java,shader,opengl-2.0,Java,Shader,Opengl 2.0,在OpenGL管道之前:我想为我渲染的某些对象使用一个特殊的顶点着色器。所以我想到了这个: int currProgram = glGetInteger(GL_CURRENT_PROGRAM); int currVertexShader = 0; if (currProgram == 0) { glUseProgram(programName); } else { currVertexShader = GLStatics.getShader(currProgram,

在OpenGL管道之前:我想为我渲染的某些对象使用一个特殊的顶点着色器。所以我想到了这个:

int currProgram = glGetInteger(GL_CURRENT_PROGRAM);
int currVertexShader = 0;
if (currProgram == 0) {
    glUseProgram(programName);
} else {
    currVertexShader = GLStatics.getShader(currProgram,
            GL_VERTEX_SHADER);
    if (currVertexShader != 0) {
        glDetachShader(currProgram, currVertexShader); // <-- problem here
    }
    glAttachShader(currProgram, shaderName);
    GLStatics.linkProgramSafe(currProgram);
}
// Actual render code
if (currProgram != 0) {
    glDetachShader(currProgram, shaderName); // Can safely detach
    if (currVertexShader != 0) {
        glAttachShader(currProgram, currVertexShader);
    }
    GLStatics.linkProgramSafe(currProgram);
}
glUseProgram(currProgram);

您可以使用另一个着色器程序,该程序仅用于在着色器与正在操作的着色器分离时“停放”着色器。这将保留一个引用,以防止其永久删除

仅显示代码的扩展部分,
dummyProgram
是您专门为此目的创建的程序:

if (currVertexShader != 0) {
    glAttachShader(dummyProgram, currVertexShader);
    glDetachShader(currProgram, currVertexShader);
}
...
if (currVertexShader != 0) {
    glAttachShader(currProgram, currVertexShader);
    glDetachShader(dummyProgram, currVertexShader);
}
这将基于规范中的以下定义(OpenGL 3.3规范中的附录D.1.2):

删除着色器对象或程序对象时,会将其标记为删除,但其名称在可以删除基础对象之前保持有效,因为它不再使用。着色器对象在附加到任何程序对象时正在使用


因此,只要将着色器附加到任何程序就足以使其被视为“正在使用”,并防止其被删除。如果您对程序/着色器生命周期的细节感兴趣,这是我对前面问题的回答:。

附加着色器就足够了,我不必链接它?你知道这比没有它要慢多少吗?是的,连接就足够了。我在答案中添加了更多的细节,并引用了规范。增加的开销应该是最小的。这并不是你想在一个紧密的循环中做的事情,但是你在同一个代码中链接一个着色器程序,这可能要贵几个数量级。
if (currVertexShader != 0) {
    glAttachShader(dummyProgram, currVertexShader);
    glDetachShader(currProgram, currVertexShader);
}
...
if (currVertexShader != 0) {
    glAttachShader(currProgram, currVertexShader);
    glDetachShader(dummyProgram, currVertexShader);
}