Разница между JavaScript "Math.Sin" и Webgl "Sin"Html

Программисты Html
Ответить
Anonymous
 Разница между JavaScript "Math.Sin" и Webgl "Sin"

Сообщение Anonymous »

В чем разница, и как мне получить грех Webgl для получения того же результата, что и Math.Sin?

Код: Выделить всё

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);
Это не работает, он дает мне неуклюжие местоположения вершины, такие как: https://i.sstatic.net/zm5qg.png

, если я вместо этого вычисляет 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);
Я получаю прекрасное распределение Fibonacci, например: https://i.sstatic.net/3qawc.png

Любые идеи о том, почему, очевидно, кажется, что существует некоторая разница в функциях 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Html»