2013-04-23 1 views
1

내가 사용하지 않는 것을 할당하지 않음으로써 비디오 카드 메모리를 절약하려고합니다. 나는 기억이 부족하다. 그러나 그것은 나에게 '깨끗한 느낌'을 줄 것이다.알파와 깊이가없는 기본 프레임 버퍼를 사용할 수 있습니까?

어쨌든 내 윈도우가 바탕 화면과 알파 블렌드되지 않기 때문에 기본 프레임 버퍼에 알파 값을 갖는 이유를 생각할 수 없습니다. 나는 그것의 알파를 제거함으로써 더 많은 색 깊이를 가질 수 있는지 궁금 해서요.

마찬가지로, 나는 약간의 지연된 조명을하고 있으며, 모든 깊이 계산은 디폴트가 아닌 프레임 버퍼에서 발생합니다. 그런 다음 장면을 렌더링 한 텍스처와 몇 가지 GUI 요소를 기본 프레임 버퍼에 쿼드 (2 트리스)를 렌더링합니다. 그 중 어느 것도 깊이 테스트가 필요하지 않습니다. 기본 프레임 버퍼를 렌더링 할 때는 glDisable(GL_DEPTH_TEST)라고 부릅니다.하지만 사용하지 않는 깊이 버퍼 대신 깊이 버퍼를 사용하지 않아도됩니다.

OpenGl에서 그렇게 할 수 있습니까? 아니면 내 OpenGL 컨텍스트를 만드는 SDL 내에서? 나는 다음과 SDL 내 OpenGL을 컨텍스트를 만들려고

는 SDL의 날 내 소원 부여 여부를 확인할 수 있도록 할 것 sdl_gl_GetAttribute 기능이 부족 GoLang 바인딩, 불행하게도

sdl.GL_SetAttribute(sdl.GL_DOUBLEBUFFER, 1) 
sdl.GL_SetAttribute(sdl.GL_DEPTH_SIZE, 0) 
sdl.GL_SetAttribute(sdl.GL_ALPHA_SIZE, 0) 
info := sdl.GetVideoInfo() 
bpp := int(info.Vfmt.BitsPerPixel) 
if screen := sdl.SetVideoMode(640, 480, bpp, sdl.OPENGL); screen == nil { 
    panic("Could not open SDL window: " + sdl.GetError()) 
} 
if err := gl.Init(); err != nil { 
    panic(err) 
} 

속성.

내가 말했듯이 긴급 상황은 없습니다. 나는 대부분 호기심이 많다.

답변

1

내 프레임이 내 바탕 화면과 알파 블렌딩되지 않기 때문에 기본 프레임 버퍼에 알파 값을 갖는 이유를 실제로 생각할 수 없습니다.

알파 채널이있는 기본 프레임 버퍼가 Windows에서 실제로 그렇게하지 않기 때문에 좋습니다.

프레임 버퍼 알파는 혼합 작업에 사용됩니다. 때로는, 목적지의 알파 칼라에 근거하는 어떤 방법으로 블렌드하는 것이 편리합니다. 예를 들어, 반사 된 표면을 그린 후에 반사 된 오브젝트를 그릴 때 반사 표면의 "반사도"값으로 대상 알파를 사용했습니다. 반사 표면을 여러 번 통과시켜야하기 때문에 순서대로 수행해야했습니다.

어쨌든 OpenGL 컨텍스트를 만들기위한 저수준 WGL/GLX/etc API를 사용하면 알파 또는 심도가 없는지 묻도록 할 수 있습니다. 0 알파 비트를 요청하면 24 비트 비트 버퍼보다 ​​32 비트 프레임 버퍼로 렌더링하는 것이 더 효율적이므로 0 메모리를 절약 할 수 있습니다. 그래서 당신도 그것을 지킬 수 있습니다.

그러나 SDL 및 SDL의 Go 바인딩을 사용하고 있기 때문에 이는 SDL에 달려 있으며 Go 바인딩입니다. sdl_gl_SetAttribute 함수가 제대로 작동해야 SDL에서 올바르게 구현됩니다. 당신이 이것을 확인하려면, 당신은 OpenGL을 통해 프레임 버퍼를 요청할 수 있습니다 : 사실

glBindFramebuffer(GL_FRAMEBUFFER, 0); //Use the default framebuffer. 
GLint depthBits, alphaBits; 
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_DEPTH, GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, &depthBits); 
glGetFramebufferAttachmentParameteriv(GL_DRAW_FRAMEBUFFER, GL_BACK_LEFT, GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, &alphaBits); 
+1

이 컴포 지터가 실행중인 X11의 윈도우 알파 혼합을 만들 것입니다 기본 프레임 버퍼에 알파 채널을 가진. https://github.com/datenwolf/codesamples/tree/master/samples/OpenGL/x11argb_opengl_glsl – datenwolf

+0

에서 데모 코드를 확인하십시오. @datenwolf : 충분합니다. –

+0

이상한 'glGetFramebufferAttachmentParameteriv'는'GL_INVALID_ENUM'을 계속 반환합니다. 문서를 제대로 읽으면 대상 "GL_DRAW_FRAMEBUFFER"이 잘못되었음을 의미합니다. 이후 아마 잘못 아니에요, 아마 문서를 부적절하게 읽고 있어요. – Niriel

관련 문제