2016-08-04 15 views
0

Я пытаюсь реализовать сбор по int id, но похоже, что мой шейдер ничего не пишет, хотя я могу правильно прочитать четкий цвет.Shader ничего не пишет для выбора по id

против, я пропустил полностью любую матрицу для отладки:

#version 330 

#include semantic.glsl 

layout (location = POSITION) in vec3 position; 

uniform Transform0 
{ 
    mat4 view; 
    mat4 proj; 
    mat4 viewProj; 
}; 

uniform Transform1 
{ 
    mat4[TRANSFORM1_SIZE] models; 
}; 

uniform Parameters 
{ 
    // x = mesh baseVertex 
    // y = selected 
    // z = active 
    // w = id 
    ivec4[INDICES_SIZE] params; 
}; 

out Block 
{ 
    flat int id; 
} outBlock; 

int getIndex() 
{ 
    int iBegin = 0; 
    int iEnd = params.length() - 1; 

    int l = iBegin; 
    int r = iEnd; 

    int i = 0; 

    if(params.length > 1) 
    { 
     do 
     { 
      i = int(((l + r)/2.0f)); 

      if (l == (r - 1)) 
       if (l == 0 && gl_VertexID <= params[l].x || gl_VertexID <= params[l].x && gl_VertexID > params[l - 1].x) 
        return l; 
       else if(gl_VertexID > params[l].x && gl_VertexID <= params[r].x) 
        return r; 
       else 
        return 0; 
      else if (gl_VertexID == params[i].x) 
       return i; 
      else if (gl_VertexID < params[i].x) 
       r = i; 
      else if (gl_VertexID > params[i].x) 
       l = i; 
     } while (l < r); 
    }  
    return 0;  
} 

void main() 
{ 
    int index = getIndex(); 

    mat4 model = models[index]; 

    //gl_Position = proj * (view * (model * vec4(position, 1))); 

    gl_Position = vec4(4.0 * float(gl_VertexID % 2) - 1.0, 4.0 * float(gl_VertexID/2) - 1.0, 0.0, 1.0); 

    outBlock.id = params[index].w; 
} 

фс, жёстко значение на данный момент, выход 0 (FRAG_COLOR), пытались также 1, но ничего:

#version 330 

#include semantic.glsl 

// Outgoing final color. 
layout (location = FRAG_COLOR) out int outputColor; 

in Block 
{ 
    flat int id; 
} inBlock; 

void main() 
{  
    //outputColor = inBlock.id; 
    outputColor = 9; 
} 

Init фаза, у меня есть один fbo, который называется RESOLVE, с 3-мя прикреплениями, одной глубиной, одним поплавковым цветом на 0 и одним целым числом для выбора 1. Fbo завершен:

gl3.glBindTexture(GL_TEXTURE_2D, textureName.get(Texture.RESOLVE_ID)); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
gl3.glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
gl3.glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I, EC.viewer.size.x, EC.viewer.size.y, 0, GL_RED_INTEGER, GL_INT, null); 

gl3.glGenFramebuffers(Framebuffer.MAX - (samples == 1 ? 1 : 0), framebufferName); 

gl3.glBindFramebuffer(GL_FRAMEBUFFER, framebufferName.get(Framebuffer.RESOLVE)); 
gl3.glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, textureName.get(Texture.RESOLVE_DEPTH), 0); 
gl3.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureName.get(Texture.RESOLVE_COLOR), 0); 
gl3.glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, textureName.get(Texture.RESOLVE_ID), 0); 

if (gl3.glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { 
    System.err.println("incomplete"); 
    return false; 
} 

и делают & чтение, также добавил glFlush, glFinish и glPixelStorei но ничего:

gl3.glBindFramebuffer(GL_FRAMEBUFFER, framebufferName.get(Framebuffer.RESOLVE)); 
gl3.glDrawBuffer(GL_COLOR_ATTACHMENT1); 
gl3.glClearBufferiv(GL_COLOR, 0, clearId.put(0, 0)); // we care clearing only red 

gl3.glBindVertexArray(EC.meshManager.vertexArrayName.get(0)); 

gl3.glEnable(GL_DEPTH_TEST); 

gl3.glUseProgram(program.name); 

gl3.glDrawElements(GL_TRIANGLES, EC_Gl3MeshManager.ELEMENT_OPAQUE_COUNT, GL_UNSIGNED_INT, 0); 

gl3.glDisable(GL_DEPTH_TEST); 

gl3.glReadBuffer(GL_COLOR_ATTACHMENT1); 

glm.vec._2.i.Vec2i window = new glm.vec._2.i.Vec2i(
      EC.inputListener.mousePressed.getX(), 
      EC.viewer.size.y - EC.inputListener.mousePressed.getY() - 1); 
System.out.println("window (" + window.x + ", " + window.y + ")"); 

gl3.glFlush(); 
gl3.glFinish(); 
gl3.glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

// Get the red coordinate reading the pixel click from the color 1 buffer, we can use the clearId buffer   
gl3.glReadPixels(window.x, window.y, 1, 1, GL_RED_INTEGER, GL_INT, clearId); 
gl3.glReadBuffer(GL_COLOR_ATTACHMENT0); 

Как я уже сказал, если я ясно с 10, я прочитал 10, так что работает, только проблематична вещь - мой шейдер ..

Можете ли вы определить ошибку, ребята?

Edit: пытаясь отлаживать, я проверяю тип вложения на цвет 1

gl3.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, 
     GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, clearId); 
System.out.println("GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: " + clearId.get(0)); 
gl3.glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, 
     GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, clearId); 
System.out.println("GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: " + clearId.get(0)+", tex: "+textureName.get(Texture.RESOLVE_ID)); 

я получаю:

GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: 5890 
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: 14, tex: 14 

5890 является GL_TEXTURE, имя выглядит правильно

пытался использовать glFramebufferTexture2D, но я все еще получаю GL_TEXTURE тип вместо GL_TEXTURE_2D

Edit 2: пытаясь прочитать компонент глубины, всегда 0

+0

Я имел несчастный опыт записывая идентификаторы идентификаторов в несколько цветных вложений на MacOS X и на Linux с интегрированной графикой Intel. (Работала нормально на nvidia.) Получается ли идентификатор выбора, если вложение выбора COLOR0? –

+0

К сожалению, это не получилось написано ни в COLOR0, ни в настройке глубины не было проблемы – elect

ответ

0

Позор мне, проблема была тест глубины, так как я забыл очистить буфер он никогда не проходящее

 Смежные вопросы

  • Нет связанных вопросов^_^