2014-09-05 25 views
0

我开发了超过20个使用OpenGL ES 2.0的移动应用程序。不过,我正在尝试让渲染器在OSX中使用我的应用程序,所以现在我正在使用带有GLSL v130的OpenGL v3.3。昨天,我遇到了一个问题,我不能使用纹理(RTT),我用GL_LINES 1.0尺寸(这是OpenGL 3.3中的最大值为什么??)在离屏FBO上绘制粒子的效果?当我使用RTT时,很小的粒子可能会消失吗?

当我在离屏FBO上绘制了几何图形,并将其作为屏幕上的纹理使用,我可以看到 以及如果在屏幕上绘制小颗粒,我可以清楚地看到这些,但如果我尝试绘制该粒子线并尝试将它用作主屏幕上的纹理我只能看到黑色纹理。

我已经检查GL错误和回宗教组织的地位和GL混合选项,但我仍然在努力解决这个问题。

有人有想法去解决呢?

虽然我觉得我的代码是好的,我连着一点点代码波纹管

// AFTER generate and bind FBO, generate RTT 
StarTexture fboTex; 
fboTex.texture_width = texture_width; 
fboTex.texture_height = texture_height; 
glGenTextures(1, &fboTex.texture_id); 
glBindTexture(GL_TEXTURE_2D,fboTex.texture_id); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width, texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fboTex.texture_id, 0); 

,此点BACK FBO

glUniformMatrix4fv(h_Uniforms[UNIFORMS_PROJECTION], 1, GL_FALSE, g_proxtrans.s); 
glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_PARTICLE]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3)*ParticleNumTotal*2, &p_particle_lc_xy[0]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_POSITION], 3, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_POSITION]); 


glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_COLOR]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_COLOR], 4, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_COLOR]); 

glLineWidth(Thickness); // 1.0 because it is maxium 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, h_VBO[VBO_INDEX_OFF1]); 
glDrawElements(GL_LINES, 400, GL_UNSIGNED_INT, 0); // 200 lines 

绘制粒子,当我画主屏幕

glClearColor(0.0, 0.0, 0.0, 1.0); 
glClear(GL_COLOR_BUFFER_BIT); 

starfbo->bindingVAO1(); 

glViewport(0, 0, ogl_Width, ogl_Height); 
glUseProgram(h_Shader_Program[Shader_Program_FINAL]); 

glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_TEXCOORD2]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_UV2], 2, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_UV2]); 

glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_SQCOORD2]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_POSITION3], 2, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_POSITION3]); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, h_VBO[VBO_INDEX_ON]); 
glDrawElements(GL_TRIANGLES,sizeof(squareIndices)/sizeof(squareIndices[0]), GL_UNSIGNED_INT ,(void*)0); 

    glUniformMatrix4fv(h_Uniforms[UNIFORMS_PROJECTION], 1, GL_FALSE, g_proxtrans.s); 


glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_PARTICLE]); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vec3)*ParticleNumTotal*2, &p_particle_lc_xy[0]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_POSITION], 3, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_POSITION]); 


glBindBuffer(GL_ARRAY_BUFFER, h_VBO[VBO_COLOR]); 
glVertexAttribPointer(h_Attributes[ATTRIBUTES_COLOR], 4, GL_FLOAT, 0, 0,0); 
glEnableVertexAttribArray(h_Attributes[ATTRIBUTES_COLOR]); 

glLineWidth(Thickness); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, h_VBO[VBO_INDEX_OFF1]); 
glDrawElements(GL_LINES, 400, GL_UNSIGNED_INT, 0); 
+0

作为一个实验,你可以尝试用黑色以外的东西清除FBO。这会告诉你纹理是否已成功用作渲染目标,并且在第二次渲染过程中如果从中进行采样。 – 2014-09-05 02:58:17

+0

@Reet Koradi正如我告诉你的,FBO被成功使用,但颗粒消失 – Sung 2014-09-05 03:46:21

回答

0
glDrawElements(GL_LINES, 400, GL_UNSIGNED_INT, 0); 

GL_UNSIGNED_INT不能在OpenGL ES与OpenGL中使用。奇怪的是,它适用于IOS,但不适用于Android。

该参数必须是GL_UNSIGNED_BYTEGL_UNSIGNED_SHORT在OpenGL ES。

2

如果渲染图像的分辨率比尺寸(以像素为单位)大得多,它会以bei ng渲染时,小功能肯定可能完全消失。

图片的极端情况。假设您将几条细线渲染到1000x1000的纹理中,照亮了总数1,000,000像素的一小部分。现在,您将该纹理映射到显示时尺寸为10x10像素的四边形。对于每个像素(假定没有MSAA),片段着色器被调用一次,这会产生100个着色器调用。这100个调用中的每一个都对纹理进行采样。使用线性采样和不使用mipmapping,它将为每个采样操作读取4个texels。在渲染多边形时总共读取了100 * 4 = 400 texels。从总数1,000,000中读取这400个纹理元素很可能会完全错过您渲染到纹理中的所有线条。减少这种问题

的一种方法是使用纹理映射。这通常会阻止这些功能完全消失。但是小的特征仍然会消失,因为越来越多的纹理元素在更高的纹理贴图级别进行平均,大多数纹理元素都是黑色的。

一个更好的,但稍微复杂一些的做法是,而不是使用自动生成的贴图,您手动创建的贴图,通过渲染相同的内容到每个纹理贴图的水平。

这可能是不够好,只是要小心,你没有将纹理太大。或者通过将它们绘制为多边形而不是使用线条基元来创建自己的宽线。

相关问题