Когда вы создаете сферу (на самом деле это также apolyhedron
) или другой многогранник в API-интерфейсе WebGL, вы получите многогранник с плоским стилем, и вы придадите текстуре многограннику, он будет выглядеть уродливый с углом между двумя малыми гранями на многограннике. на самом деле, вы можете разделить поверхность, чтобы получить гладкую поверхность. и есть ли другой способ smooth the surface
на polyhedron.just взгляд LILE как два изображения, как показано ниже. (две картины захват с помощью программного обеспечения блендер)гладкий край в программировании WebGL
Вот мой код для создания сферы
function getSphere(r,segment_lat,segment_lon){
var normalData = [];
var vertexData = [];
var textureCoord = [];
var vertexIndex = [],
for (var latNum = 0; latNum <= segment_lat; latNum++) {
var theta = latNum * Math.PI/segment_lat;
var sinTheta = Math.sin(theta);
var cosTheta = Math.cos(theta);
for (var lonNum = 0; lonNum <= segment_lon; lonNum++) {
var phi = lonNum * 2 * Math.PI/segment_lon;
var sinPhi = Math.sin(phi);
var cosPhi = Math.cos(phi);
var x = cosPhi * sinTheta;
var y = cosTheta;
var z = sinPhi * sinTheta;
var u = 1 - (lonNum/segment_lon);
var v = 1 - (latNum/segment_lat);
textureCoord.push(u);
textureCoord.push(v);
vertexData.push(r * x);
vertexData.push(r * y);
vertexData.push(r * z);
}
}
for (var latNum=0; latNum < segment_lat;latNum++) {
for (var lonNum=0; lonNum < segment_lon; lonNum++) {
var first = (latNum * (segment_lon + 1)) + lonNum;
var second = first + segment_lon + 1;
vertexIndex .push(first);
vertexIndex .push(second);
vertexIndex .push(first + 1);
vertexIndex .push(second);
vertexIndex .push(second + 1);
vertexIndex .push(first + 1);
}
}
return {'vertexData':vertexData,'vertexIndex':vertexIndex,'textureCoord':textureCoord,'normalDatas':normalData};
},
пиксельного шейдера:
precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
void main(void) {
vec3 light = vec3(1,1,1);
vec4 textureColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(textureColor.rgb*light,textureColor.a);
// gl_FragColor = vec4 (1,0,0,.8);
}
Vertex Shader:
attribute vec2 aTextureCoord;
attribute vec3 aVertexPosition;
// uniform mediump mat4 proj_inv;
uniform mediump mat4 modelViewMatrix;
uniform mediump mat4 projectMatrix;
varying highp vec2 vTextureCoord;
void main(void) {
//projectMatrix multi modelViewMatrix must be in vertex shader,or it will be wrong;
gl_Position = projectMatrix*modelViewMatrix*vec4(aVertexPosition, 1.0);
vTextureCoord = aTextureCoord;
}
Использование [Затенение фонтана] (https://en.wikipedia.org/wiki/Phong_shading). –
WebGL не имеет API для создания сферы. Возможно, lib. Таким образом, независимо от того, является ли эта сфера гладкой или плоской, зависит от реализации lib. –
Вы не получите плоскую сферу. WebGL не имеет сфер. [WebGL - это просто библиотека растеризации] (http://webglfundamentals.org/webgl/lessons/webgl-how-it-works.html). Сферы, как показано на рисунке, требуют, чтобы вы предоставили код или использовали библиотеку. На самом деле, возможно, больше работы, чтобы получить плоские заштрихованные сферы в WebGL, чем не плоские затененные. Что вы пробовали? – gman