2014-04-06 2 views
1

내가 지정된 입력과 상자를, WebGL을 쉐이더를 사용하여 단일 정수 입력 (기본적으로 색상)과를 취할 색상을 원하는 응용 프로그램에서 일하고 있어요에 값을 RGB로. 때문에, int 0xFF33CC 주어진16 진수 WebGL을 쉐이더

uniform int u_color; 

float rValue = (((u_color) >> 16) & 0xFF)/255.0; 
float gValue = (((u_color) >> 8) & 0xFF)/255.0; 
float bValue = ((u_color) & 0xFF)/255.0; 
gl_FragColor = vec4(rValue, gValue, bValue, 1.0); 

, 1.0 = 적색, 녹색 = 0.2, 파란색 = 0.8

그러나, 아래 있듯이 나는 변화 & 마스크의 조합으로이 작업을 수행하기 위해, 원래 계획 문제가 발생하여 WebGL 쉐이더가 비트 단위로 쉬프트를 수행 할 수 없음을 알게되었습니다.

내가 그도 가능하다면 효율적으로 지정된 정수에서 적절한 FragColor을 생산할 수있을 얼마나 궁금하네요.

편집 : @Jongware에 시행 착오, 그리고 감사의 비트 후, 나는 최대 깨끗한보다는

uniform int u_color; 
float rValue = float(u_color/256/256); 
float gValue = float(u_color/256 - int(rValue * 256.0)); 
float bValue = float(u_color - int(rValue * 256.0 * 256.0) - int(gValue * 256.0)); 
gl_FragColor = vec4(rValue/255.0, gValue/255.0, bValue/255.0, 1.0); 

다른 해결책을 마련했습니다,이 코드는 작업에 적합 그러나 나는 항상 위에서 언급 한 것과 다른 다른 방법에 관심이있을 것입니다.

+1

비트 이동이 없으면 '/ 256'과 '/ 65536'을 사용할 수 있습니다. (하지만 숫자가 실수로 변환되지 않는지 확인해보십시오. 그렇다면''대신''와''대신''% ''를 사용해야 할 수도 있습니다.) – usr2564301

+0

고마워, ! –

+0

일반적인 대답은 다음과 같습니다. http://stackoverflow.com/questions/18453302/how-do-you-pack-one-32bit-int-into-4-8bit-ints-in-glsl-webgl. "효율성"이 간다면, 여러분의 상수가 프래그먼트 컴파일러에 의해 접혀지기를 바랍니다. – usr2564301

답변

2

직접 답변을 추가하려면 끝까지 정수 수학을 사용하는 것이 좋습니다.

uniform int u_color; 
unsigned rIntValue = (u_color/256/256) % 256; 
unsigned gIntValue = (u_color/256  ) % 256; 
unsigned bIntValue = (u_color   ) % 256; 
gl_FragColor = vec4(rInt/255.0f, gIntValue/255.0f, bIntValue/255.0f, 1.0);