Кто использовал брунетоновскую атмосферу, не сталкивались ли вы с багом на нвидиях? Начиная примерно с GTX 460, текстуры скаттеринга не генерируются правильно, планета рендерится чёрной, если посмотреть значения в текстурах - там #IND. После долгого копания, нашёл место, в котором можно исправить это. В шейдере irradianceN.glsl надо заменить этот код:
if (first == 1.0) { // first iteration is special because Rayleigh and Mie were stored separately, // without the phase functions factors; they must be reintroduced here float pr1 = phaseFunctionR( nu); float pm1 = phaseFunctionM( nu); vec3 ray1 = texture4D( deltaSRSampler, r, w.z, muS, nu).rgb; vec3 mie1 = texture4D( deltaSMSampler, r, w.z, muS, nu).rgb; result += ( ray1 * pr1 + mie1 * pm1) * w.z * dw; } else { result += texture4D( deltaSRSampler, r, w.z, muS, nu).rgb * w.z * dw; }
на этот:
if (first == 1.0) { // first iteration is special because Rayleigh and Mie were stored separately, // without the phase functions factors; they must be reintroduced here float pr1 = phaseFunctionR( nu); float pm1 = phaseFunctionM( nu); vec3 ray1 = texture4D( deltaSRSampler, r, w.z, muS, nu).rgb; vec3 mie1 = texture4D( deltaSMSampler, r, w.z, muS, nu).rgb; result += max( ray1 * pr1 + mie1 * pm1, 0.0) * w.z * dw; } else { result += max( texture4D( deltaSRSampler, r, w.z, muS, nu).rgb, 0.0) * w.z * dw; }
Т.е. сделать так, чтобы в result приплюсовывались только неотрицательные значения. При этом странно то, что сэмплеры deltaSRSampler и deltaSMSampler не содержат отрицательных или #IND значений (а pr1 и pm1 и так всегда положительные). Если сравнить рендер планеты со старыми текстурами скаттеринга, загруженными из файла, и вновь предрассчитанными с этим фиксом, отличий вроде нет. В общем, я думаю, это баг в дровах нвидии.
Neptune
Хотел написать, что нормально всё, но получается по факту, что я давно уже генерацией не пользовался. Помню, что на радеоне 5450 оно вообще висло.
Тема в архиве.