2012-12-31 114 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