2014-09-05 1 views
0

OpenGL ES 2.0을 사용하여 20 개 이상의 모바일 앱을 개발했습니다. 그러나 OSX에서 내 애플 리케이션을 사용하는 렌더러를 만들려고 노력 중이므로 GLSL v130과 함께 OpenGL v3.3을 사용하고 있습니다. 어제, GL_LINES 1.0 크기의 오프 스크린 FBO에서 입자를 그린 텍스처 (RTT)를 사용할 수 없다는 문제에 봉착했습니다 (OpenGL 3.3에서 최대 값입니까?)RTT를 사용하면 매우 작은 입자가 사라질 수 있습니까?

오프 스크린 FBO에서 지오메트리를 그린 다음 화면 상에 텍스처로 사용했을 때 나는 을 볼 수 있었고 스크린에 작은 입자를 그려도 분명히 볼 수 있었지만 그 입자 선을 그리려면 메인 화면의 감촉으로 사용하려고하면 검은 질감 만 볼 수 있습니다.

나는 이미 GL 오류와 FBO의 상태 및 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를 검정색으로 지울 수도 있습니다. 텍스처가 렌더 타겟으로 성공적으로 사용되고, 두 번째 렌더 패스에서 샘플링이 제대로 작동 하는지를 보여줍니다. –

+0

@Reto Koradi 내가 말했듯이 FBO는 성공적으로 사용되었지만 입자는 사라집니다. – Sung

답변

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

GL_UNSIGNED_INT는 OpenGL ES와 OpenGL에서 사용할 수 없습니다. 이상하게도 IOS에서는 작동하지만 Android에서는 작동하지 않습니다.

매개 변수는 GL_UNSIGNED_BYTE 또는 OpenGL을 ES의 GL_UNSIGNED_SHORT해야합니다.

2

렌더링 된 이미지의 해상도가 크기 (픽셀 단위)보다 훨씬 큰 경우 최대로 끝납니다. 렌더링 된 경우 작은 기능이 완전히 사라질 가능성이 큽니다.

그림 극단적 인 경우. 1000x1000 텍스처로가는 선 몇 개를 렌더링하여 총 1,000,000 픽셀의 매우 작은 부분을 조명한다고 가정 해 보겠습니다. 이제이 텍스처를 표시 할 때 10x10 픽셀 크기의 쿼드로 매핑합니다. 프래그먼트 셰이더는 각 픽셀에 대해 한 번 호출되며 (MSAA가 없다고 가정 함) 100 개의 셰이더 호출이 수행됩니다. 이 각각의 100 개 호출은 텍스처를 샘플링합니다. 선형 샘플링 및 밉 매핑이 없으면 각 샘플 작업마다 4 개의 텍셀을 읽습니다. 전체적으로 다각형을 렌더링하는 동안 100 * 4 = 400 텍셀을 읽습니다. 총 100 만 개에서 400 개 텍셀을 읽으면 텍스쳐에 포함 된 모든 선이 완전히 사라질 가능성이 큽니다.

이 문제를 줄이는 한 가지 방법은 밉 매핑을 사용하는 것입니다. 이렇게하면 일반적으로 기능이 완전히 사라지지 않습니다. 그러나 대부분의 텍셀이 검은 색 인 높은 밉맵 레벨에서 점점 더 많은 텍셀이 평균화되기 때문에 작은 기능은 여전히 ​​사라질 것입니다.

더 좋지만 약간 더 복잡한 방법은 자동 생성 된 밉맵을 사용하는 대신 동일한 콘텐츠를 각 밉맵 수준으로 렌더링하여 밉맵을 수동으로 생성하는 것입니다.

텍스처를 너무 크게 만들지 않도록 조심하는 것만으로도 충분할 수 있습니다. 또는 선 원형을 사용하는 대신 다각형으로 그려서 자신의 넓은 선을 만들 수 있습니다.

관련 문제