GLSL + OpenGL Отход от конечного автомата - PullRequest
4 голосов
/ 11 апреля 2011

Эй, ребята, я начал перемещать один из своих проектов из фиксированного конвейера, поэтому, чтобы попробовать что-то, я попытался написать шейдер, который бы просто пропускал матрицы OpenGL и преобразовывал вершины с этим, а затем начинал вычислять свой собственный, как только знал, что сработало. Я думал, что это будет простая задача, но даже это не будет работать.

Я начал с этого шейдера для обычного фиксированного конвейера:

void main(void)
{
    gl_Position = gl_ModelViewProjectionMatrix  * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
}

Затем я изменил это на:

uniform mat4 model_matrix;
uniform mat4 projection_matrix;

void main(void)
{
    gl_Position = model_matrix * projection_matrix * gl_Vertex;
    gl_TexCoord[0] = gl_MultiTexCoord0;
}

Затем я получаю матрицы OpenGL, подобные этой, и передаю их шейдеру с таким кодом:

 [material.shader bindShader];

 GLfloat modelmat[16];
        GLfloat projectionmat[16];

        glGetFloatv(GL_MODELVIEW_MATRIX, modelmat);
        glGetFloatv(GL_PROJECTION_MATRIX, projectionmat);


        glUniformMatrix4fv([material.shader getUniformLocation:"model_matrix"], 1, GL_FALSE, modelmat);
        glUniformMatrix4fv([material.shader getUniformLocation:"projection_matrix"], 1, GL_FALSE, projectionmat );
... Draw Stuff  

По какой-то причине это ничего не привлекает (я на 95% уверен, что эти матрицы верны, прежде чем я их передам, кстати) Любые идеи?

Ответы [ 3 ]

2 голосов
/ 09 августа 2013

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

Правильный порядок должен быть:

projection * modelview * vertex

Благодаря ltjax и doug65536

2 голосов
/ 21 апреля 2011

Для математической математики попробуйте использовать внешнюю библиотеку, такую ​​как GLM . У них также есть несколько базовых примеров о том, как создать необходимые матрицы и выполнить преобразование проекции * view * model.

0 голосов
/ 04 января 2013

Используйте язык затенения OpenGL 3.3. Аппаратно OpenGL 3.3 примерно сопоставим с DirectX10.

Не используйте устаревшую функциональность. Почти все в вашем первом void main примере устарело. Вы должны четко объявить свои входы и выходы, если вы планируете использовать высокопроизводительный путь кода драйверов. Устаревшие функциональные возможности также скорее всего будут полны ошибок драйверов.

Используйте более новый, более явный стиль объявления входов и выходов и установите их в своем коде. Это действительно не плохо. Я думал, что это будет некрасиво, но на самом деле это было довольно легко (хотелось бы, чтобы я только что сделал это раньше).

К вашему сведению, в последний раз, когда я смотрел на наименьший общий знаменатель для OpenGL (2012), это был OpenGL 3.3. Практически все видеокарты от AMD и NVidia, которые имеют какие-либо игровые возможности, будут иметь OpenGL 3.3. И они какое-то время есть, поэтому любой код, который вы сейчас пишете для OpenGL 3.3, будет работать на типичном низкоуровневом или более качественном GPU.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...