2016-12-13 1 views
1

그래서 1D 텍스처로 어려움을 겪고 있습니다. 달성하기 위해 노력하고있는 것은 uniform으로 프래그먼트 쉐이더에 3 개의 float 값을 전달하는 것입니다. 그것들은 빛의 색을 나타내며, n 빛에 대해 동일한 쉐이더를 재사용하려고 시도하며, 모든 정보 (색과 위치)가 텍스처에 저장됩니다. 지금은, 나는 하나의 빛에 대해서만 색을 통과 시키려고 노력하고 있습니다.OpenGL 1D 텍스처 : 임의의 부동 소수점 값으로 채우기

uniform sampler1D lightColor; 
... 
vec3 lc = vec3(texelFetch(lightColor, 0, 0)); // all zeroes 
vec3 lc = vec3(texture(lightColor, 0, 0)); // same 

나는 아무 소용이 두 경우 모두, 쉐이더 (하나 또는 다른) 내 texelFetchtexture 전화로 모두를 달성하기 위해 시도했다 : 프래그먼트 쉐이더에서 그래서 난이 있습니다. 나는이 같은 쉐이더의 값을 하드 코딩하는 경우주의하시기 바랍니다 : 다음

vec3 lc = vec3(0.0f, 0.0f, 0.8f); 

을 내가 (lc 비 제로 값입니다) 예상 결과를 얻을, 그래서 난 긍정적, 적어도 셰이더 문제가 texelFetch 또는 texture 호출에있을 수 있습니다. 다음과 같이 돌아 가기 C++ 땅에서

은, 코드 (내 lightManager 초기화 할 때 한 번만 실행)은 다음과 같습니다 (분명히 잘못된 있지만) 여기가는

GLfloat lightValues[] = { 0.8f, 0.8f, 0.8f }; 
GLuint lightID; // member, not a local variable. 
glGenTextures(1, &lightID); 
glBindTexture(GL_TEXTURE_1D, lightID); 
glActiveTexture(GL_TEXTURE0 + lightID); 
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexStorage1D(GL_TEXTURE_1D, 1, GL_RGB32F, 1); 
glTexSubImage1D(GL_TEXTURE_1D, 0, 0, 3 * sizeof(GLfloat), GL_RGB, GL_FLOAT, lightValues); 
glUniform1i(glGetUniformLocation(shader->program, "light"), lightID); 

아무것도 매우 공상. OpenGL 문서의 표 6.2를 살펴본 후 glTexStorage1D에 대해 levels (MipMaps 없음) 및 GL_RGB32F()을 1로 선택했습니다 (이후 3 개의 부동 소수점을 전달하려고합니다). width은 단일 값이므로 1입니다. 그것은 할당을 처리해야합니다.

이제, glTexSubImage1D와 버퍼를 채우는에있는 나는 type 같은 형식으로 GLfloat, GL_RGBGLfloat의 크기를 배로 폭 level 0 (다시, 더 밉맵), xoffset 0을 선택하지 . 마지막으로 실제 데이터입니다.

는 C++ 코드에 대한 몇 가지 : 내가 제대로 나는 (glUniform1iglGetUniformLocation를 통해) sader에 균일 위치/연결이 올바른지 말할 것 (그래서 비난 아니다) GL_NEAREST에 필터를 설정합니다.

그래서 여기 내 질문에 오는 :

  • 먼저하고 명백한, 텍스처를 통해 빛의 정보 전달이 메이크업의 의미는 무엇입니까? 셰이더는 lights[n]과 같은 물건을 뻔뻔스럽게 처리 할 수 ​​없습니다. n을 컴파일 할 때 알아야 할 필요가 있기 때문에 텍스처를 자연스럽게 마음대로 트릭합니다.
  • 둘째로, 데이터의 크기가 범인이 될 수 있다고 내 가정은 맞습니까? 나는 텍스쳐의 완성도에 대해 읽었지만, 솔직히 말해서 그것은 약간 간결했다. 1 텍셀의 크기는 분명히 비린내가 난다.
  • 셋째, 다른 점이 있습니까? 특히, internalFormat, formattype?
  • 넷째, 일반적으로 모든 아이디어가 lc에 0으로 채워지는 이유는 무엇입니까?

감사합니다.

EDIT : 다중 통과 또는 쉐이더에 전달되는 라이트 수에 하드 제한을 정의하는 것을 원하지 않습니다. (이 일정 함). OpenGL 4.2의 일부 기능에 대해서도 읽었습니다. 그렇다고해서 저도 관심이 없습니다. 나는 단지 손에 들고있는 도구로 배우려고 노력하고있다. (그러나 100 % 보장 할 수있는 것은 미래에 내가이 문제에 대해 궁금한 점이있다.)

답변

0

좋아, 함께 알아 냈어. https://stackoverflow.com/users/1774414/raistmaj

glTexStorageglTexSubImage에 관계없이, 구성 요소의 수 배열의 요소 수 있으므로 1. 또한

glActiveTextureglBindTexture (뜨아!)

전에 호출되어야 둘 다 width 밝혀
+0

당신은 또한 glActiveTe를 오용하고 있습니다. 텍스쳐 ID를 가진 xture. OpenGL은 오류를 생성하고 해당 호출을 무시합니다. – datenwolf

+0

오용의 의미는 무엇입니까? 그 합계 때문에? AFAIK는 꽤 표준적인 방법입니다. 런타임까지 'lightID'값을 알 수없는 경우, 활성화 할 텍스처 단위를 어떻게 알 수 있습니까? –

+1

GL_TEXTURE_0에 * 텍스처 이름 *을 추가하는 것이 잘못되었습니다. * 그게 어떻게 되는거야! * 특정 수의 텍스처 유닛이 있습니다 (0 ~ N, N은'glGetInteger (GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS) '로 질의 할 수있는 숫자 임)'glActiveTexture (GL_TEXTURE_0 + i)'를 호출하는 것이 유효합니다. 여기서 i는 glGenTextures로 생성하고'glBindTexture'로 생성하는 것은 텍스쳐 이름 *이라고 불리우며 1에서 2^32-1 범위의 모든 것을 텍스처 이름으로 사용할 수 있습니다. – datenwolf

관련 문제