我在WIN 7 64bit作为操作系统使用J3DI(这是一个webGL库)做了一个球体 和Nvidia Geforce GT330 M作为显卡。
首先我用蓝色做了它,看起来很正确。
然后,我尝试在它上面制作一个纹理,但是球体看起来像这个图像: http://s1.postimage.org/1ekqrgolg/earth.jpg
虽然它在Mac中出现如下: http://s1.postimage.org/1eksf0138/error.jpg
那么,问题是什么?是来自OS,J3DI还是来自显卡?
有关其他信息,我使用的着色器脚本: 注意:此代码取自OpenGL和HTML5(来自O'reilly的视频课程) VertexShader:
uniform mat4 u_modelViewProjMatrix;
uniform mat4 u_normalMatrix;
uniform vec3 lightDir;
attribute vec3 vNormal;
attribute vec4 vTexCoord;
attribute vec4 vPosition;
varying float v_Dot;
varying vec2 v_texCoord;
void main()
{
gl_Position = u_modelViewProjMatrix * vPosition;
v_texCoord = vTexCoord.st;
vec4 transNormal = u_normalMatrix * vec4(vNormal, 1);
v_Dot = max(dot(normalize(transNormal.xyz), normalize(lightDir)), 0.3);
}
PixelShader:
#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D sampler2d;
varying float v_Dot;
varying vec2 v_texCoord;
void main()
{
vec2 texCoord = vec2(v_texCoord.s, v_texCoord.t);
vec4 color = texture2D(sampler2d, texCoord);
color += vec4(0.1, 0.1, 0.1, 1);
gl_FragColor = vec4(color.xyz * v_Dot, color.a);
}
上下文功能是:
function(context){
// setup VBOs
context.enableVertexAttribArray(0);
context.enableVertexAttribArray(1);
context.enableVertexAttribArray(2);
context.bindBuffer(context.ARRAY_BUFFER, context.sphere.normalObject);
context.vertexAttribPointer(0, 3, context.FLOAT, false, 0, 0);
context.bindBuffer(context.ARRAY_BUFFER, context.sphere.texCoordObject);
context.vertexAttribPointer(1, 2, context.FLOAT, false, 0, 0);
context.bindBuffer(context.ARRAY_BUFFER, context.sphere.vertexObject);
context.vertexAttribPointer(2, 3, context.FLOAT, false, 0, 0);
context.bindBuffer(context.ELEMENT_ARRAY_BUFFER, context.sphere.indexObject);
//constract the model-view * projection matrix
var mvpMatrix = new J3DIMatrix4(context.perspectiveMatrix);
mvpMatrix.setUniform(context, context.getUniformLocation(context.program, "u_modelViewProjMatrix"), false);
//bind texture
context.bindTexture(context.TEXTURE_2D, this.texture);
context.drawElements(context.TRIANGLES, context.sphere.numIndices, context.UNSIGNED_SHORT, 0);
}
我真的很担心这个问题。
答案 0 :(得分:0)
你快到了。在:
v_Dot = max(dot(normalize(transNormal.xyz), normalize(lightDir)), 0.3);
最后将0.3更改为1.0,这应该有效(编辑:至少对于Windows,MAC可能是过时的驱动程序)。