Может кто-нибудь помочь мне с простой проблемой? Я поместил квадрат, построенный из множества треугольников, таких как 20 * 20 треугольников, я добавил к этому квадрату текстуру, также я установил нормаль к этому квадрату, и, поскольку он расположен в нулевой плоскости Z, нормаль очень легко найти (0,0,1). Проблема в том, что я вообще не вижу своего текстурированного квадрата, освещенного пятном. Я также пытался убрать окружающий свет и уменьшить его, но без шансов. Также я увеличил количество маленьких треугольников с квадрата для лучшего разрешения, но не повезло. Я ищу основной пример, но не повезло. Также кто-то нашел решение для пятна поверх текстуры, или кто-то может дать мне небольшой пример?
Итак:
- В созданную поверхность я положил:
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_FASTEST);
gl.glClearColor(.5f, .5f, .5f, 1);
gl.glShadeModel(GL10.GL_SMOOTH);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
float lightAmbient[] = new float[] { 0.3f, 0.3f, 0.3f, 1 };
float lightDiffuse[] = new float[] { 0.7f, 0.7f, 0.7f, 1 };
float lightSpecular[] = new float[] { 0.7f, 0.7f, 0.7f, 1 };
lightDirection = new float[] {0.0f, 0.0f, -1.0f};
lightPos = new float[] { 0, 0, 10f, 1 };
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbient, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuse, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPECULAR, lightSpecular, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPos, 0);
gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_SPOT_DIRECTION, lightDirection, 0);
gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_CUTOFF, 3f);
gl.glLightf(GL10.GL_LIGHT0, GL10.GL_SPOT_EXPONENT, 100f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDepthFunc(GL10.GL_LESS);
gl.glDisable(GL10.GL_DITHER);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
mTextureID = textures[0];
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_CLAMP_TO_EDGE);
gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
GL10.GL_REPLACE);
InputStream is = mContext.getResources()
.openRawResource(R.raw.wood);
Bitmap bitmap;
try {
bitmap = BitmapFactory.decodeStream(is);
} finally {
try {
is.close();
} catch(IOException e) {
// Ignore.
}
}
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
В onDrawFrame я добавил:
gl.glClear (GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl, 0, 0, 10, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureID);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
GL10.GL_REPEAT);
mSquare.draw(gl);
Класс Square довольно прост:
Площадь класса {
int point = 1;
int x1 = -2;
int x2 = 2;
int y1 = -2;
int y2 = 2;
int W = x2 - x1;
int H = y2 - y1;
int dx = 30;
int dy = 30;
private float vertices2[] = new float[3*4*dx * dy];
private float normals[] = new float[3*4*dx * dy];
float one = 1.0f;
float texCoords[] = new float[3*4*dx * dy];
private FloatBuffer vertexbuffer1 = null;
private FloatBuffer mTextureBuffer = null;
private FloatBuffer mNormalBuffer = null;
private void initVertexes() {
float incW = W/(float)dx;
float incH = H/(float)dy;
int i = 0;
int j = 0;
int k = 0;
for(float y = y2; y >= (y1 + incH) ; y -= incH)
for(float x = x1; x<= (x2 - incW); x += incW) {
vertices2[i++] = x ;
vertices2[i++] = y - incH;
vertices2[i++] = -point;
texCoords[j++] = (x2 + x)/(4f*W);
texCoords[j++] = (y2 + y -incH)/(4f*H);
normals[k++] = 0;
normals[k++] = 0;
normals[k++] = 1;
vertices2[i++] = x ;
vertices2[i++] = y ;
vertices2[i++] = -point;
texCoords[j++] = (x2 + x)/(4f*W);
texCoords[j++] = (y2 + y)/(4f*H);
normals[k++] = 0;
normals[k++] = 0;
normals[k++] = 1;
vertices2[i++] = x + incW;
vertices2[i++] = y - incH ;
vertices2[i++] = -point;
texCoords[j++] = (x2 + x + incW)/(4f*W);
texCoords[j++] = (y2 + y - incH)/(4f*H);
normals[k++] = 0;
normals[k++] = 0;
normals[k++] = 1;
vertices2[i++] = x + incW;
vertices2[i++] = y ;
vertices2[i++] = -point;
texCoords[j++] = (x2 + x + incW)/(4f*W);
texCoords[j++] = (y2 + y)/(4f*H);
normals[k++] = 0;
normals[k++] = 0;
normals[k++] = 1;
}
}
public Square() {
initVertexes();
ByteBuffer vbb1 = ByteBuffer.allocateDirect(vertices2.length * 4);
vbb1.order(ByteOrder.nativeOrder());
vertexbuffer1 = vbb1.asFloatBuffer();
vertexbuffer1.put(vertices2);
vertexbuffer1.position(0);
ByteBuffer txtb1 = ByteBuffer.allocateDirect(texCoords.length * 4);
txtb1.order(ByteOrder.nativeOrder());
mTextureBuffer = txtb1.asFloatBuffer();
mTextureBuffer.put(texCoords);
mTextureBuffer.position(0);
ByteBuffer nor = ByteBuffer.allocateDirect(normals.length * 4);
nor.order(ByteOrder.nativeOrder());
mNormalBuffer = nor.asFloatBuffer();
mNormalBuffer.put(normals);
mNormalBuffer.position(0);
}
public void draw(GL10 gl) {
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glNormalPointer(3, 0, mNormalBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexbuffer1);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 2*2*dx*dy);
}
}