2015-02-22 3 views
0

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

Мне удалось вычислить нормали поверхности в геометрическом шейдере, но это создало неприемлемое узкое место, так как даже с ним в основном просто было проходным шейдером, большое количество полигонов забивало gs вниз. Я застрял в OpenGL 4.2, поэтому расширение nVidias passthrough недоступно для меня.

Я думал, что, возможно, предвыборная нормальная карта может быть способом, но я не уверен, как сгенерировать это на основе моей карты смещения смещенных проекций. Любые мысли или полезные советы?

ответ

0

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

vec4 GenerateNormal(int imgWid, int imgHei, GLuint *displacementMap, int texX, int texY) 
{ 
    float normalStrength = 8; 
    int xCoord = texX;// (int)(texX*(float)imgWid); 
    int yCoord = texY;// (int)(texY*(float)imgHei); 
    float tl = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, -1, -1)); // top left 
    float l = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, -1, 0)); // left 
    float bl = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, -1, 1)); // bottom left 
    float t = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, 0, -1)); // top 
    float b = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, 0, 1)); // bottom 
    float tr = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, 1, -1)); // top right 
    float r = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, 1, 0)); // right 
    float br = abs(GetDisplacement(displacementMap, texX, texY, imgWid, imgHei, 1, 1)); // bottom right 
    // Compute dx using Sobel: 
    //   -1 0 1 
    //   -2 0 2 
    //   -1 0 1 
    float dX = tr + 2 * r + br - tl - 2 * l - bl; 
    // Compute dy using Sobel: 
    //   -1 -2 -1 
    //   0 0 0 
    //   1 2 1 
    float dY = bl + 2 * b + br - tl - 2 * t - tr; 
    // Build the normalized normal 
    vec4 N = vec4(normalize(vec3(dX, 1.0f/normalStrength, dY)), 1.0f); 
    //convert (-1.0 , 1.0) to (0.0 , 1.0), if needed 
    return normalize(N * 0.5f + 0.5f); 
} 
+0

Если вы собираетесь отказаться от решения или ответа, пожалуйста, сообщите мне, почему вы это сделали. – user3758015

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