Ошибка вершинного шейдера при передаче мне sh индекса лица с помощью glvertex4i - PullRequest
0 голосов
/ 21 января 2020

Инициализация GL_List для обработки.

glBegin(GL_POINTS); 
for (i = 0; i < faceNum; i++)
{
    mesh->GetFaceNodes(i + 1, ver[0], ver[1], ver[2], ver[3]);
    **glVertex4i(ver[0] - 1, ver[1] - 1, ver[2] - 1, i+1);**
}
glEnd();    
glEndList();

Vertex Shader выдает ошибку компиляции и не знает, почему.

Вершинный шейдер:

varying out float final;

void main( void )
{
    final = float(gl_Vertex.w);       // want to pass this face index on to 
}

Геометрический шейдер:

varying in float final[];
varying out float final_tofrag;
final_tofrag=final[0];


//Doing other calculations here they are totally different 

Фрагментный шейдер:

varying in float final_tofrag;

void main( void )
{
    if (color.z<0.0)
            gl_FragData[0] = vec4(float(final_frag),float(final_frag), -(gl_FragCoord.z), 0); // want to check that value of the final(gl_vertex.w) is being passed from vertex shader to fragment shader or not. Its giving me 0.00000;
    else
            gl_FragData[0] = vec4(float(final_frag), float(final_frag), gl_FragCoord.z, 0);
}

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Поскольку шейдер не содержит никакой информации о версии, это Язык шейдеров OpenGL 1.10 Спецификация шейдер.

В GLSL 1.10 varying переменные типа int не допускаются и неявное приведение от int до float не поддерживается. В glsl 1.10 нет переменных in и out. Ключевое слово для переменных-переменных: varying.

Кроме того, переменная color не определена в фрагментном шейдере.

varying float final;

void main( void )
{
    final = gl_Vertex.w;

    // [...]
}
varying float final_tofrag;

void main( void )
{
    if (final_tofrag < 0.0) // ?
         gl_FragData[0] = vec4(final_tofrag, final_tofrag, -gl_FragCoord.z, 0.0);
    else
         gl_FragData[0] = vec4(final_tofrag, final_tofrag, gl_FragCoord.z, 0.0);
}

Рекомендую проверить, компиляция шейдера прошла успешно, и если программный объект успешно соединился.

Если компиляция шейдера прошла успешно, можно проверить с помощью glGetShaderiv и параметра GL_COMPILE_STATUS. Например:

#include <iostream>
#include <vector>
bool CompileStatus( GLuint shader )
{
    GLint status = GL_TRUE;
    glGetShaderiv( shader, GL_COMPILE_STATUS, &status );
    if (status == GL_FALSE)
    {
        GLint logLen;
        glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logLen );
        std::vector< char >log( logLen );
        GLsizei written;
        glGetShaderInfoLog( shader, logLen, &written, log.data() );
        std::cout << "compile error:" << std::endl << log.data() << std::endl;
    }
    return status != GL_FALSE;
}

Если связывание программы прошло успешно, можно проверить с помощью glGetProgramiv и параметра GL_LINK_STATUS. например:

bool LinkStatus( GLuint program )
{
    GLint status = GL_TRUE;
    glGetProgramiv( program, GL_LINK_STATUS, &status );
    if (status == GL_FALSE)
    {
        GLint logLen;
        glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logLen );
        std::vector< char >log( logLen );
        GLsizei written;
        glGetProgramInfoLog( program, logLen, &written, log.data() );
        std::cout << "link error:" << std::endl << log.data() << std::endl;
    }
    return status != GL_FALSE;
}
0 голосов
/ 22 января 2020

Код в вопросе не имеет никакого смысла. Ключевое слово GLSL varying было выбрано потому, что оно должно было отражать свойство того, что данные будут отличаться для каждого фрагмента из-за автоматической c интерполяции примитива. Это происходит только между последним этапом программируемого шейдера перед rasrerizer и фрагментным шейдером.

В начале были только вершинный шейдер и фрагментный шейдер. VS получит attribute с в качестве входа и выведет на varying с, что будет интерполяцией и станет входом для ФС.

С введением Geometry Shader в GL 3.0 / GLSL 1.30 эта схема больше не имела смысла. Выходы VS больше не будут интерполироваться, а станут прямыми входами GS. В результате ключевые слова attribute и varying, где удалены из GLSL и заменены более общей схемой in / out.

В результате GS с varying не может существовать. Вы либо используете устаревший GLSL, который не поддерживает геометрические шейдеры, либо используете более новый GLSL с in / out.

0 голосов
/ 21 января 2020

Будет полезно, если вы действительно опубликуете ошибку компиляции в своем вопросе, в противном случае мы не знаем, в чем ваша ошибка.

Итак, поскольку я беру случайные предположения в темноте, я сделаю пару предположений здесь.

  1. Вы присваиваете число с плавающей точкой для целого числа, что может привести к ошибке преобразования.
// this might now compile, but it will probably only ever give you
// zero or one. Was that the intent?
final = int(gl_Vertex.w); 

Вы НЕ пишете в gl_Position в вашем вершинном шейдере. Если вы не записываете это значение, OpenGL не сможет выполнить ваш вершинный шейдер.

В вашем фрагментном шейдере вы проверяете значение color.z , но Вы не объявили цвет как униформу, шейдерный ввод или константу.

Хотя это не приведет к ошибке компиляции, разделив final (целое число со значением 1 или 0?) , целочисленное значение 100 или 1000 только даст вам ноль или единицу. Было ли намерение использовать final как число с плавающей точкой, а не как целое число?

Вы смешиваете целые числа и числа с плавающей точкой в ​​объявлении vec4 в своем фрагментном шейдере. Это может вызывать ошибку компилятора.

К сожалению, без доступа к журналу ошибок GLSL никто не сможет сделать что-то, чтобы идентифицировать вашу проблему, помимо перечисленных выше.

...