2014-02-07 10 views
1

따라서 ID를 통해 피킹을 구현하려고합니다. 즉, 모든 drawArray에서 다른 고유 ID가 유니폼으로 설정되고 텍스처의 빨간색 구성 요소에 저장됩니다.Jogl, u16 채널 만 생성하지만 "텍스처 유형 및 형식 조합이 유효하지 않습니다."

16 비트 (65K 요소) 충분하다, 그래서 내가 균일 변수는 UI가 될 수 있다는 것을 알고, 반바지를 사용하도록 선택,하지만 난 그것을 내가 또 다른 문제를 발견

어쨌든 시도 준하기로 결정 대답은 프레임 버퍼와 두 개의 텍스처, 깊이 하나 16

 textures = new int[2]; 
     fbo = new int[1]; 

     gl3.glGenTextures(2, textures, 0); 
     gl3.glGenFramebuffers(1, fbo, 0); 
     /** 
     * Depth. 
     */ 
     gl3.glBindTexture(GL3.GL_TEXTURE_RECTANGLE, textures[depth]); 

     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_S, GL3.GL_CLAMP_TO_EDGE); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_T, GL3.GL_CLAMP_TO_EDGE); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_NEAREST); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_NEAREST); 

     gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_DEPTH_COMPONENT32F, width, height, 0, GL3.GL_DEPTH_COMPONENT, GL3.GL_FLOAT, null); 
     /** 
     * IDs. 
     */ 
     gl3.glBindTexture(GL3.GL_TEXTURE_RECTANGLE, textures[id]); 

     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_S, GL3.GL_CLAMP_TO_EDGE); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_WRAP_T, GL3.GL_CLAMP_TO_EDGE); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MIN_FILTER, GL3.GL_NEAREST); 
     gl3.glTexParameteri(GL3.GL_TEXTURE_RECTANGLE, GL3.GL_TEXTURE_MAG_FILTER, GL3.GL_NEAREST); 

     gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16UI, width, height, 0, GL3.GL_RED, GL3.GL_UNSIGNED_SHORT, null); 
     /** 
     * FBO. 
     */ 
     gl3.glBindFramebuffer(GL3.GL_FRAMEBUFFER, fbo[0]); 
     gl3.glFramebufferTexture2D(GL3.GL_FRAMEBUFFER, GL3.GL_DEPTH_ATTACHMENT, GL3.GL_TEXTURE_RECTANGLE, textures[depth], 0); 
     gl3.glFramebufferTexture2D(GL3.GL_FRAMEBUFFER, GL3.GL_COLOR_ATTACHMENT0, GL3.GL_TEXTURE_RECTANGLE, textures[id], 0); 
그냥 적색 성분과 color_attachment0 하나를 초기화 반바지

그러나 여기

내 코드와 작은 예제를 포함 here는,

내가에서 다음과 같은 오류가 ID-glTexImage2D 완성도를 들어

GLDebugEvent[ id 0x502 
    type Error 
    severity High: dangerous undefined behavior 
    source GL API 
    msg GL_INVALID_OPERATION error generated. Texture type and format combination is not valid. 
    when 1391769197680 
    source 4.4 (Compat profile, arb, debug, ES2 compat, ES3 compat, FBO, hardware) - 4.4.0 - hash 0x1c19b340] 
java.lang.Exception: Stack trace 
at java.lang.Thread.dumpStack(Thread.java:1364) 
at jogamp.opengl.GLDebugMessageHandler$StdErrGLDebugListener.messageSent(GLDebugMessageHandler.java:308) 
at jogamp.opengl.GLDebugMessageHandler.sendMessage(GLDebugMessageHandler.java:293) 
at jogamp.opengl.GLDebugMessageHandler.glDebugMessageARB(GLDebugMessageHandler.java:319) 
at jogamp.opengl.gl4.GL4bcImpl.dispatch_glTexImage2D1(Native Method) 
at jogamp.opengl.gl4.GL4bcImpl.glTexImage2D(GL4bcImpl.java:27313) 
at javax.media.opengl.DebugGL4bc.glTexImage2D(DebugGL4bc.java:19874) 
at ec.rendering.input.picking.EC_Picking.initRenderingTargets(EC_Picking.java:107) 

, 여기 VS :

#version 330 

layout (location = 0) in vec3 position; 

uniform mat4 modelToWorldMatrix; 

layout(std140) uniform GlobalMatrices { 
    mat4 worldToCameraMatrix; 
    mat4 cameraToClipMatrix; 
}; 

void main() { 

    gl_Position = cameraToClipMatrix * (worldToCameraMatrix * vec4(position, 1.0)); 
} 

modelToWorldMatrix 아직 순간에 계정에서 촬영되지

그리고 여기 FS :

#version 330 

uniform uint id; 

out vec4 outputColor; 

void main() { 

    outputColor = vec4(id, 0, 0, 1); 
} 

반바지를 사용하는 것이 가능합니까?

JOGL, OpenGL을 3.3

편집 : 그것은 내가

gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16I, width, height, 0, GL3.GL_RED_INTEGER, GL3.GL_SHORT, null); 

으로 그 부분을 해결하지만 짧은 균일 한 값

gl3.glUniform1i(pickModel.getIdUL(), (int)mesh.getId()); 
을 설정하려고하면 지금은 오류가 지금 보이는

오류

GLDebugEvent[ id 0x502 
    type Error 
    severity High: dangerous undefined behavior 
    source GL API 
    msg GL_INVALID_OPERATION error generated. Wrong component type or count. 
    when 1391779682993 
    source 4.4 (Compat profile, arb, debug, ES2 compat, ES3 compat, FBO, hardware) - 4.4.0 - hash 0x5ee072e3] 

-1 (실제로는 1)이 아니기 때문에 균일 한 위치가 올바른 것처럼 보입니다 ...

어떻게하면 짧은 정보를 업로드 할 수 있습니까?

+0

이미 존재하는 답변에 대한 추가 질문이나 의견이 있습니까? 아니면 이미 문제를 직접 해결하셨습니까? –

+0

@ChristianRau 아니요, 나는 청산 색조차도 모순이 있었기 때문에 제가하지 않았습니다. http://www.opengl.org/discussion_boards/showthread.php/183630-Encoding-id-picking-into-a-16b-red- 구성 요소 - 질감? p = 1257745 # post1257745 그래서 포기하기로 결정했습니다. – elect

답변

0

대부분의 문제는 OpenGL이 예상대로 변환에 정교하지 않다는 사실과 관련이 있습니다.

먼저 glUniform을 호출하면 균일 변수의 유형과 크기가 함수와 정확히 일치해야합니다. 구체적 the documentation 말한다 :이 함수의 부호있는 정수 변이체의 일 유형 부호 INT, uvec2, uvec3, uvec4, 또는 이들의 배열의 균일 한 변수를로드하는 데 사용되는 경우

GL_INVALID_OPERATION

가 생성된다.

따라서 있습니다 (U 마음!) 대신 glUniform1ui를 사용하여 id 변수가 uint 경우합니다.


이외에도 프레임 버퍼의 출력 형식과 쉐이더의 출력 형식간에 불일치가 있습니다. 당신이 정수 질감에 쓰고 싶은 경우에, 당신은 당신의 outputColor

out int outputID; 

아니면

out ivec4 outputID; 

경우이 켜지지 (또는과 "U"으로 변경하여, 셰이더에서 실제 정수를 작성해야 물론 GL_R16UI을 사용하는 경우).


그리고 그런데

, 당신은 당신이 (부호로 사용하는 경우에 훨씬 더 자연스러운 것) 부호있는 정수의 질감을 필요로 확신? 당신은

gl3.glTexImage2D(GL3.GL_TEXTURE_RECTANGLE, 0, GL3.GL_R16I, width, height, 0, GL3.GL_RED_INTEGER, GL3.GL_SHORT, null); 

glTexImage2D 전화를 변경하면 텍스처 오류가 사라 만든 말, 그러나 이것은 아주 잘 때문에 서명 형식의 사용으로 인해 대신 GL_REDGL_RED_INTEGER의 사용 왔으며 반드시 수 있습니다. 따라서 GL_R16UI과 함께 GL_UNSIGNED_SHORTGL_RED_INTEGER (물론 출력 변수로는 uint 또는 uvec4) 시도해 볼 가치가 있습니다.

유형이 항상 일치해야한다는 점을 명심하십시오.

+0

안녕하세요 크리스천, 답장을 보내 주셔서 감사합니다. 어쨌든 시도해 볼만한 가치가 있습니다.이 게시물을 살펴 보시기 바랍니다. int (짧은/int/u 뭐든간에) 텍스처에 대한 클리어에 대해 어떻게 생각하는지 말해주세요. http://www.opengl.org/discussion_boards/showthread.php/183630-Encoding-id-picking-into-a-16b-red-component-texture?p=1257745#post1257745 – elect