2015-02-12 2 views
3

Предоставляет ли OpenGL API, чтобы получить количество выходов фрагментарных шейдеров?Количество выходов фрагмента шейдера

я нашел такие функции, как glBindFragDataLocation, glBindFragDataLocationIndexed, glGetFragDataIndex и glGetFragDataLocation, но все они предназначены для установки индексов или местоположения FragData с известным именем.

Я думаю, что я ищу что-то вроде glGetProgram(handle, GL_NUM_FRAGDATA, &i). Есть идеи?

Существует очень похожий API для получения количества обмундирования и attrbutes:

  • glGetProgramiv(handle, GL_ACTIVE_UNIFORMS, &numUniforms)
  • glGetProgramiv(handle, GL_ACTIVE_ATTRIBUTES, &numAttribs)

Спасибо заранее.

ответ

3

В разделе API на программных интерфейсов является то, что вы ищете:

int num_frag_outputs;   //Where GL will write the number of outputs 
glGetProgramInterfaceiv(program_handle, GL_PROGRAM_OUTPUT, 
    GL_ACTIVE_RESOURCES, &num_frag_outputs); 

//Now you can query for the names and indices of the outputs 

for (int i = 0; i < num_frag_outs; i++) 
{ 
    int identifier_length; 
    char identifier[128];   //Where GL will write the variable name 
    glGetProgramResourceName(program_handle, GL_PROGRAM_OUTPUT, 
     i, 128, &identifier_length, identifier); 

    if (identifier_length > 128) { 
     //If this happens then the variable name had more than 128 characters 
     //You will need to query again with an array of size identifier_length 
    } 
    unsigned int output_index = glGetProgramResourceIndex(program_handle, 
    GL_PROGRAM_OUTPUT, identifier); 

    //Use output_index to bind data to the parameter called identifier 
} 

Вы используете GL_PROGRAM_OUTPUT, чтобы указать, что вы хотите, выходы из финальной стадии затенения. Используя другие значения, вы можете запросить другие программные интерфейсы, чтобы найти выходные данные шейдеров с других этапов. Ознакомьтесь с разделом 7.3.1 из спецификации OpenGL 4.5 для получения дополнительной информации.

+0

Спасибо. Это именно то, что я искал. – t91

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