2017-02-15 34 views
-1

Написание простого Compute Shader в OpenGL, чтобы понять, как это работает, я не могу управлять, чтобы получить желаемый результат.Массива структур в Compute Shader

Я хочу передать моему Compute Shader массив структур colourStruct окрашивать выходную структуру.

Я хотел бы иметь красное изображение, когда «wantedColor» = 0 в моем Compute Shader и зеленый образ «wantedColor» = 1, синий для 2.

Но я на самом деле есть только красный, когда «wantedColor» = 1 или 2 или 3 и черный, когда «wantedColor»> 2 ...

Если кто-то имеет представление о том, или, может быть, я не понял, что Compute Shader входы идеи.

Благодарим за помощь, вот интересная часть моего кода.

Мой Compute Shader:

#version 430 compatibility 

layout(std430, binding=4) buffer Couleureuh 
{ 
    vec3 Coul[3]; // array of structures 
}; 

layout(local_size_x = 1, local_size_y = 1) in; 
layout(rgba32f, binding = 0) uniform image2D img_output; 

void main() { 

    // base pixel colour for image 
    vec4 pixel = vec4(0.0, 0.0, 0.0, 1.0); 

    // get index in global work group i.e x,y, position 
    ivec2 pixel_coords = ivec2(gl_GlobalInvocationID.xy); 
    ivec2 dims = imageSize (img_output); 


    int colorWanted = 0; 
    pixel = vec4(Coul[colorWanted], 1.0); 

    // output to a secific pixel in the image 
    imageStore (img_output, pixel_coords, pixel); 

} 

Вычислительный шейдер и инициализация SSBO:

GLuint structBuffer; 
    glGenBuffers(1, &structBuffer); 
    glBindBuffer(GL_SHADER_STORAGE_BUFFER, structBuffer); 
    glBufferData(GL_SHADER_STORAGE_BUFFER, 3*sizeof(colorStruct), NULL, GL_STATIC_DRAW); 

     GLint bufMask = GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT; // invalidate makes a ig difference when re-writting 

    colorStruct *coul; 
    coul = (colorStruct *) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, 3*sizeof(colorStruct), bufMask); 


    coul[0].r = 1.0f; 
    coul[0].g = 0.0f; 
    coul[0].b = 0.0f; 

    coul[1].r = 0.0f; 
    coul[1].g = 1.0f; 
    coul[1].b = 0.0f; 

    coul[2].r = 0.0f; 
    coul[2].g = 0.0f; 
    coul[2].b = 1.0f; 

    glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); 

    glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4, structBuffer); 

    m_out_texture.bindImage(); 

    // Launch compute shader 
    m_shader.use(); 

    glDispatchCompute(m_tex_w, m_tex_h, 1); 

    // Prevent samplign before all writes to image are done 
    glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); 

ответ

0

vec3 всегда 16 байт выровнены. Таким образом, когда они находятся в массиве, они действуют как vec4 s. Даже с макетом std430.

Never use vec3 in interface blocks. Вы должны либо использовать массив float s (индивидуально получить доступ к 3 членам, которые вы хотите), либо массив из vec4 (с неиспользуемым элементом).

+0

Работает с использованием поплавков и vec4! Большое спасибо! :). – bRiocHe

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

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