2012-12-31 77 views
0

我有一个在搅拌机中创建的模型并导出到.obj文件。我写了一个解析器,读入顶点纹理和法线的坐标。我一直在用适用于程序的常量来划分所有坐标系,以减小模式的大小以适合屏幕(这是一种临时措施)。这工作正常,除了没有工作的照明,我留下一个黑色的3D对象,当它应该是彩色的。经过网络研究之后,我认为这可能是因为法线不是一个长度?如果这是真的,我该如何扩展我的坐标以使它们适合屏幕并使照明工作?标准化顶点和法线坐标Open GL ES 2.0

顶点着色器

// 
// Created by Jake Cunningham on 13/10/2012. 
// Copyright (c) 2012 Jake Cunningham. All rights reserved. 
// 

attribute vec4 position; 
attribute vec3 normal; 

varying lowp vec4 colorVarying; 

uniform mat4 modelViewProjectionMatrix; 
uniform mat3 normalMatrix; 

attribute vec2 TextCo; 
varying vec2 textCoOut; 

void main() 
{ 
vec3 eyeNormal = normalize(normalMatrix * normal); 
vec3 lightPosition = vec3(0.0, 0.0, 1.0); 
vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0); 

float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition))); 

colorVarying = diffuseColor * nDotVP; 

gl_Position = modelViewProjectionMatrix * position; 
textCoOut = TextCo; 
} 

片段着色器:

// Created by Jake Cunningham on 13/10/2012. 
// Copyright (c) 2012 Jake Cunningham. All rights reserved. 
// 

varying lowp vec4 colorVarying; 

varying lowp vec2 textCoOut; 
uniform sampler2D texture; 

void main() 
{ 
gl_FragColor = colorVarying * texture2D(texture, textCoOut); 

} 

从视图控制器的代码。

glEnable(GL_DEPTH_TEST); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


glGenVertexArraysOES(1, &_vertexArray); 
glBindVertexArrayOES(_vertexArray); 

glGenBuffers(1, &_vertexBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfVerticies * sizeof(GLfloat) * 3, arrayOfVerticies, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 

glGenVertexArraysOES(1, &_normalArray); 
glBindVertexArrayOES(_normalArray); 

glGenBuffers(1, &_normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _normalBuffer); 
glBufferData(GLKVertexAttribNormal, loader.currentCountOfNormals * sizeof(GLfloat) * 3,loader.arrayOfNormals , GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, 12, BUFFER_OFFSET(0)); 

glGenVertexArraysOES(1, &_textureArray); 
glBindVertexArrayOES(_textureArray); 

glGenBuffers(1, &_textureBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, _textureBuffer); 
glBufferData(GL_ARRAY_BUFFER, loader.currentCountOfTextureCoordinates * sizeof(GLfloat) * 2, loader.arrayOftextureCoOrdinates, GL_STATIC_DRAW); 

glEnableVertexAttribArray(GLKVertexAttribTexCoord0); 
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 8, BUFFER_OFFSET(0)); 


glBindVertexArrayOES(0); 
+0

你能分享你的着色器代码吗? – TheAmateurProgrammer

回答

1

如果您正在使用着色器,你可以用你的GLSL代码中你的顶点和法线的normalize()操作。

您还可以看看obj2opengl script,它对您的模型进行缩放,居中和标准化,将OBJ文件转换为准备用于iOS实现的头文件。我还将该脚本扩展为mtl2opengl,以包含对MTL文件的支持并使其更加轻量(也是一个Xcode示例)。

+0

欢呼声。我实现了,但仍然得到一个黑色的立方体。可能有一个额外的错误。 – geminiCoder