2016-10-09 4 views
0

짧은 storry :단일 채널 텍스처 (OpenGL 2) 사용?

내가 얻을 수 있습니다 :이

glTexImage2D (GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, pixels); 

같은로드 질감을 사용하여 무엇을 렌더링 할 때

나는 검은 색으로 만


긴 storry를 얻을 수 알파 채널이있는 RGBA 텍스처 (예 : 텍스트 투명 backgorund에이 코드를 사용하여)으로 :

이 코드는 작동합니다

// === load 
#define GL_ABGR 0x8000 
SDL_Surface * surf = SDL_LoadBMP("common_resources/dejvu_sans_mono_RGBA.bmp"); 
glGenTextures (1, &itex); 
glBindTexture (GL_TEXTURE_2D, itex); 
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, surf->w, surf->h, 0, GL_ABGR, GL_UNSIGNED_BYTE, surf->pixels); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
// .... 
// === render 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, itex); 
glColor3f(1.0f,1.0f,1.0f); 
glEnable(GL_BLEND); 
glEnable(GL_ALPHA_TEST); 
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
drawString (caption,    xmin, ymin+12, 6); 

enter image description here

처럼 렌더링하지만 하나 개의 채널 (8 비트를 사용하려고 해요; 그레이 스케일) RGBA 대신에 이미지/텍스처. 이것들은 transparancy없이 또는없이 렌더링을 할 수 없습니다. 내가하는 일이 무엇이든 나는 검은 색 이미지 만 얻는다.

// === load 
#define GL_ABGR 0x8000 
SDL_Surface * surf = SDL_LoadBMP("common_resources/dejvu_sans_mono_Alpha.bmp"); 
glGenTextures (1, &itex); 
glBindTexture (GL_TEXTURE_2D, itex); 
glTexImage2D (GL_TEXTURE_2D, 0, GL_R8, surf->w, surf->h, 0, GL_RED, GL_UNSIGNED_BYTE, surf->pixels); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
// .... 
// === render 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, itex); 
glColor3f(1.0f,1.0f,1.0f); 
//glEnable(GL_BLEND); 
//glEnable(GL_ALPHA_TEST); 
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); 
drawString (caption,    xmin, ymin+12, 6); 

enter image description here

노트처럼 렌더링하지 이것은 않습니다

  1. 내가 어떻게 든 예에 따라 glTexEnv 사용해야 함을 알고 here는하지만 내 주요 문제는 분명히 흑백의 질감이 나는 아무 차이 glTexImage2D에 다른 GL_LUMINANCEGL_INTENSITY 대신 GL_RED 시도 모든
  2. 로 렌더링하지 않는다는 것입니다
  3. herehere하지만 대부분과 같은 다른 질문이 있습니다 OpenGL> 3.0 및 조각 쉐이더

또한 그래픽 카드 또는 드라이버가이 기능을 지원하지 않을 수 있습니까? 나는 완벽 우분투 16.04

GL_VENDOR:  Intel Open Source Technology Center 
GL_RENDERER: Mesa DRI Intel(R) HD Graphics 530 (Skylake GT2) 
GL_VERSION: 3.0 Mesa 11.2.0 

에있어 - drawString은 다음과 같습니다 importaint되지는 않지만 :

drawString (caption,    xmin, ymin+12, 6){ 
    const int nchars = 95; 
    float persprite = 1.0f/nchars; 
    glBegin(GL_QUADS); 
    for(int i=0; i<65536; i++){ 
    if(str[i] == 0) break; // 0-terminated string 
    int isprite = str[i] - 33; // 33 is offset of meaningfull ASCII characters 
    float offset = isprite*persprite+(persprite*0.57); 
    float xi = i*sz + x; 
    glTexCoord2f(offset   , 1.0f); glVertex3f(xi, y, 3.0f); 
    glTexCoord2f(offset+persprite, 1.0f); glVertex3f(xi+sz, y, 3.0f); 
    glTexCoord2f(offset+persprite, 0.0f); glVertex3f(xi+sz, y+sz*2, 3.0f); 
    glTexCoord2f(offset   , 0.0f); glVertex3f(xi, y+sz*2, 3.0f); 
    } 
    glEnd(); 

} 내가 도울하려고 시도하는

답변

-1

당신. 내 프로젝트에서 나는 그레이 스케일 소스 이미지에서 질감을 생성하기위한이 인수를 사용하고 있습니다 : documentation에 기록 된대로

glTexImage2D(GL_TEXTURE_2D, 0, 1, width, height, 0, GL_RED, 
      GL_UNSIGNED_BYTE, pixels); 

, 세 번째 인수를 - 색상 구성 요소의 수 (1 우리의 경우). GL_R8의 정수 값을 확인하거나 명시 적으로 교체해야합니다.

GL_RED은 빨간색 채널에 밝기를 배치한다는 것을 의미합니다 (회색 음영 이미지의 경우 각 빨강, 녹색, 파란색 채널이 아님).

+0

덕분에 'glTexImage2D (GL_TEXTURE_2D, 0, 1, 서핑 -> w, 서핑 -> h, 0, GL_RED, GL_UNSIGNED_BYTE, surf -> pixels)'를 시도했지만 resut은 여전히 ​​동일합니다 ... 어쩌면 정말 인텔 GPU는 그것을 지원하지 않습니다. (?) –

+0

@ProkopHapala, 명령'''glPixelStorei (GL_UNPACK_ALIGNMENT, 1);'''가 있습니까? 나는 보통 "''glBindTexture'''->'''glPixelStorei''''->'''x2 glTexParameteri''''->'''glTexImage2D'''를 호출하고 있습니다. –

+1

내부 포맷 텍스처의. 그레이 스케일 이미지의 경우에도 항상 사용되는 크기의 이미지 형식. –