簡體   English   中英

在Shader中使用Sampler2D的問題

[英]Issue with using Sampler2D with a Shader

我知道有比這更簡單的繪制到屏幕上的方法,但是我需要以這種特定的方式來做!

我正在通過fbo繪制紋理。 然后,我使用着色器將其重新繪制到屏幕上,使用(紋理的)sampler2D,並在片段着色器所處的特定點處,將着色器將gl_fragColor設置為sampler2D的顏色。

我遇到的問題是,即使我以藍色背景為fbo繪制了一個白色正方形,顯示緩沖區(着色器將fbo拖動到該顯示緩沖區)也只是純藍色。

我的代碼:

主渲染循環:

while(!Display.isCloseRequested()){
        //Drawing on the fbo a blue background and white square
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID);
        glColor3f(0,0,1);
        drawQuad(0,0,WIDTH,HEIGHT);
        glColor3f(1,1,1);
        drawQuad(0,0,50,50);

        //Trying to draw the texture from the previous fbo
        //on to the display buffer with a fragment shader,
        //however it only draws a blue background, no white square.

        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

        GL13.glActiveTexture(GL13.GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D,texID);
        glUseProgram(shaderProgram);
        glUniform1i(glGetUniformLocation(shaderProgram, "tex"), 0);
        glUniform1f(glGetUniformLocation(shaderProgram, "width"), WIDTH);
        glUniform1f(glGetUniformLocation(shaderProgram, "height"), HEIGHT);

        glBegin(GL_QUADS); {
            glVertex2f(0, 0);
            glVertex2f(0, HEIGHT);
            glVertex2f(WIDTH, HEIGHT);
            glVertex2f(WIDTH, 0);
        } glEnd();
        glUseProgram(0);

        Display.update();
    }

我的明暗器:

uniform sampler2D tex;
uniform float width;
uniform float height;

void main() {
    vec4 color = texture2D( tex, gl_FragCoord.xy / vec2(width, height));
    gl_FragColor = color;
}

fbo的初始化方法:

    texID=glGenTextures();
    fboID=glGenFramebuffersEXT();

    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, WIDTH, HEIGHT, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null);
    glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, texID, 0);
    glBindTexture(GL_TEXTURE_2D, 0);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

我認為發生這種情況的一個原因可能是因為我沒有正確將Sampler2D傳遞給着色器,但是我不確定如何修復它。

如果有什么辦法可以說明為什么會這樣,或者如何解決(甚至只是正確方向的一個問題),將不勝感激!

(對不起,英語不好!)

您已將調用轉換為glUniform1i (...)glUseProgram (...)

在那個時間glUniform1i(glGetUniformLocation(shaderProgram, "tex"), 0); 執行后,當前活動程序為0 ,實際上應該產生以下錯誤:

如果沒有當前程序對象,則生成GL_INVALID_OPERATION

如果交換上面提到的兩行,那應該可以解決您的問題。 將來,您應該在無法正常工作時檢查glGetError (...)


更新 :現在,原始問題已解決,您沒有正確設置紋理最小化濾鏡。

要設置枚舉數,必須使用glTexParameteri (...) glTexParameterf (...)將解釋作為浮點數傳遞的值,並且GL_LINEAR0x2601 )具有類型GLenum (32位無符號整數)。 幸運的是,所有核心OpenGL枚舉僅使用低16位,因此它們可以精確地表示為32位浮點數(可以表示所有整數,最大為2 24 ),但是您可以看到為什么不想將整數常量轉換為a浮動。

因此,以下行:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

需要是:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

更新2 :使用texture2D (...)時,必須使用規范化的紋理坐標。

gl_FragCoord.xy的范圍為[ 0width ]和[ 0height ],對於任何大於1x1的幀緩沖區,此范圍均超出歸一化范圍。 要解決此問題,必須除以寬度和高度。

texelFetch (...)允許您使用非規范化的坐標,但是它需要GLSL 1.30,並且必須將gl_FragCoord.xyivec2才能使用。 如果您繪制的FBO的尺寸與窗戶的尺寸不同,也可能會帶來不便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM