Код: Выделить всё
attribute float index;
float inc = 3.141592653589793238462643383279 * (3.0 - sqrt(5.0));
float off = 2.0 / 2500000;
float yy = index * off - 1.0 + (off / 2.0);
float rr = sqrt(1.0 - yy * yy);
float phi = index* inc;
vec3 fibPoint = vec3(cos(phi) * rr, yy, sin(phi) * rr);
, если я вместо этого вычисляет Cos (phi) и sin (phi) на CPU с математикой Javascript. это: < /p>
Код: Выделить всё
attribute float index;
attribute float sinphi;
attribute float cosphi;
float inc = 3.141592653589793238462643383279 * (3.0 - sqrt(5.0));
float off = 2.0 / 2500000;
float yy = index * off - 1.0 + (off / 2.0);
float rr = sqrt(1.0 - yy * yy);
float phi = index* inc;
vec3 fibPoint = vec3(cosphi * rr, yy, sinphi * rr);
Любые идеи о том, почему, очевидно, кажется, что существует некоторая разница в функциях cos/sin между Glsl и Javascript? PHI может стать довольно большим количеством, например, «5476389.695241543». Может, это слишком велика для точности GLSL? < /p>
edit 2: < /strong> < /p>
vertexShader: [
"attribute float index;",
"attribute float cosphi;",
"attribute float sinphi;",
"attribute float displacementType;",
"uniform vec3 faceCorner;",
"uniform vec3 faceNormal;",
"uniform vec3 faceCenter;",
"varying vec2 vTexCoord;",
"void main()",
"{",
"vTexCoord = uv;",
// find fibonacci distribution of points on sphere
"float inc = 3.141592653589793238462643383279 * 0.7639320225002102;",
"float off = 0.0000008;",
"float yy = index* off - 1.0 + (off / 2.0);",
"float rr = sqrt(1.0 - yy * yy);",
"float phi = index* inc;",
"vec3 fibPoint = vec3(cos(phi) * rr * -1.0, yy, sin(phi) * rr * -1.0);",
// intersecting face
"vec3 normalizedFaceNormal = normalize(faceNormal);",
"float planeConstant = - dot(faceCorner, normalizedFaceNormal);",
"float denominator = dot(normalizedFaceNormal, fibPoint);",
"float distanceToPlane = - planeConstant / denominator;",
"vec3 intersectPoint = normalize(fibPoint) * distanceToPlane;",
"intersectPoint = faceCenter;",
// displacement
"float buildingRadius = 3.0;",
"vec3 newPosition = position;",
"vec3 cornerVec = normalize(faceCorner - intersectPoint) * buildingRadius;",
// ground vertices
"if(displacementType == 0.0){",
"newPosition = intersectPoint + cornerVec;",
"} else if(displacementType == 1.0){",
"newPosition = cross(cornerVec, normalizedFaceNormal);",
"newPosition = intersectPoint + newPosition;",
"} else if(displacementType == 2.0){",
"newPosition = intersectPoint - cornerVec;",
"} else if(displacementType == 3.0){",
"newPosition = cross(normalizedFaceNormal, cornerVec);",
"newPosition = intersectPoint + newPosition;",
"} else {",
// roof vertices
"vec3 corner0 = intersectPoint + cornerVec;",
"vec3 corner1 = intersectPoint + cross(cornerVec, normalizedFaceNormal);",
"float UVdistance = length(corner0 - corner1);",
"float buildingHeight = UVdistance * 2.0;",
"vec3 roofCentroid = intersectPoint + normalizedFaceNormal * (-buildingHeight);",
"if(displacementType == 4.0){",
"newPosition = roofCentroid + cornerVec;",
"} else if(displacementType == 5.0){",
"newPosition = cross(cornerVec, normalizedFaceNormal);",
"newPosition = roofCentroid + newPosition;",
"} else if(displacementType == 6.0){",
"newPosition = roofCentroid - cornerVec;",
"} else {",
"newPosition = cross(normalizedFaceNormal, cornerVec);",
"newPosition = roofCentroid + newPosition;",
"}",
"}",
"gl_Position = projectionMatrix * modelViewMatrix * vec4(newPosition.xyz, 1.0);",
"}"
].join("\n"),
< /code>
Итак, этот дает неисправные позиции в вершине, если я изменяю «cos (phi)» и «sin (phi)» на коспи и sinphi, которые являются атрибутами, рассчитанными на процессоре, по математике Javascript (phi) и Math.cos (phi), тогда работает код. Здания /кубики не повреждены, поэтому смещение работает и пересекающиеся работы, поскольку здания /кубики ставят на поверхность сферы, с правильным дискеттопланом. < /P>
Ответ от кукурузы на gamedev.net:>
32-разрядным поплавками, это дает вам только 6 десятичных цифр точности.
5476389.695241543 до 6 десятичных цифр точности-5476380,000000 (усечение всего после 6 цифр). PI составляет всего ~ 3,14, а
, поскольку sin /cos периодические, использование больших чисел не дает вам никакой выгоды
по сравнению с использованием меньших чисел (потому что большие числа только
обертываются вокруг). Тем не менее, ваши цифры настолько велики, что они обертывают
настолько, что даже не отображаются в диапазоне [-pi, pi] (или [0,
2pi]). По сути, упаковка вокруг выбросает все цифры «высокие»
и сохраняет только соответствующие низкие цифры, но, к сожалению, для
вы все ваши низкие цифры - это мусор, потому что вы потратили все 6 своих
точных цифр на те, которые будут выброшены, и теперь все ваши
low (но наиболее важные) цифры не имеют смысла. Вы. < /p>
Тем не менее, в JavaScript все номера с плавающими темпами 64-битные, которые
дает вам 15 десятичных цифр точности. Это означает, что в JavaScript вы
действительно можете правильно представлять 5476389.69524154, поэтому ваши расчеты Trig
на самом деле точны (при условии, что ваш код JavaScript
обработка те же большие значения, что и ваш вертексный шейдер). < /P>
< /blockquote>
Подробнее здесь: https://stackoverflow.com/questions/174 ... d-webglsin