2013-02-04 48 views
0

我正在使用openGL,我想要做的是將我的場景渲染到紋理,然後存儲該紋理,以便我可以將其傳遞到我的片段着色器以用於渲染其他內容。在着色器中使用glTexture

我使用glGenTexture()創建了一個紋理,並將其附加到幀緩衝區,然後用glBindFrameBuffer()渲染幀緩衝區。然後我將framebuffer設置回0以回到屏幕,但現在我卡住了。

在我的片段着色器中,我有一個統一的採樣器2D'myTexture',我想用它來存儲紋理。我如何去做這件事?

對於我在網上找到.JPG/PNG圖片我只是用下面的代碼:

glUseProgram(Shader->GetProgramID()); 
GLint ID = glGetUniformLocation(
       Shader->GetProgramID(), "Map"); 
glUniform1i(ID, 0); 
glActiveTexture(GL_TEXTURE0); 
MapImage->Bind(); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

但是這個代碼不爲我創造了glTexture工作。具體來說,我不能以同樣的方式調用myTexture-> Bind()。

回答

0

因此,我創建使用glGenTexture()紋理和你這樣做換句話說,它連接到一個幀緩衝區

所以:

glActiveTexture(GL_TEXTURE0); 
GLuint myTexture; 
glGenTextures(1, &myTexture); 
glBindTexture(GL_TEXTURE_2D, myTexture); 

// very important and often missed by newbies: 
// A framebuffer attachment must be initialized but not bound 
// when using the framebuffer, so it must be unbound after 
// initializing 
glTexImage2D(…, NULL); 
glBindTexture(GL_TEXTURE_2D, 0); 

glBindFramebuffer(…); 
glFramebufferTexture2D(…, myTexture, …); 

好了,myTexture是名處理紋理。我們該做什麼?解除綁定的FBO,這樣我們就可以使用附加的紋理作爲圖像源,所以:

glBindFrameuffer(…, 0); 

glActiveTexture(GL_TEXTURE0 + n); 
glBindTexture(GL_TEXTURE_2D, myTexture); 

glUseProgram(…); 
glUniformi(texture_sampler_location, n); 
+0

謝謝!我會試試看看它是否有效。但是你從哪裏得到你的'n'變量? – user1782677

+0

@ user1782677:我在那裏放了'n'變量,以清楚傳遞給採樣器統一體的值和紋理單元之間的關係。紋理單元GL_TEXTURE0中綁定的紋理通過值爲0的採樣器統一進行訪問(而不是GL_TEXTURE0)。 'n'可以是任何小於所使用的OpenGL實現支持的最大紋理單元數量的數值。 – datenwolf

1

如果你真的在你的着色器「一uniform sampler 2D 'myTexture'」,你爲什麼對得到均勻的位置「地圖」?你應該獲得「myTexture」的統一位置;畢竟這是採樣器的名字。

+0

我只是用它作爲我如何訪問*不同*着色器的一個例子。但是,當我試圖將其應用到'myTexture'ti ddint'工作。主要是因爲我用於地圖的紋理來自一個JPG,而我用於'myTexture'的紋理來自於使用glGenTexture() – user1782677

+0

@ user1782677:*所有* OpenGL紋理來自'glGenTextures',無論是直接使用還是間接使用圖書館。 –