Основная проблема с текстурой, освещенной прожектором - PullRequest
0 голосов
/ 04 июля 2010

Может кто-нибудь помочь мне с простой проблемой? Я поместил квадрат, построенный из множества треугольников, таких как 20 * 20 треугольников, я добавил к этому квадрату текстуру, также я установил нормаль к этому квадрату, и, поскольку он расположен в нулевой плоскости Z, нормаль очень легко найти (0,0,1). Проблема в том, что я вообще не вижу своего текстурированного квадрата, освещенного пятном. Я также пытался убрать окружающий свет и уменьшить его, но без шансов. Также я увеличил количество маленьких треугольников с квадрата для лучшего разрешения, но не повезло. Я ищу основной пример, но не повезло. Также кто-то нашел решение для пятна поверх текстуры, или кто-то может дать мне небольшой пример? Итак:

  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();
  1. В 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);
    
  2. Класс 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);

}

}

1 Ответ

0 голосов
/ 04 июля 2010

Вы убедились, что ваш свет освещает квадрат, когда вы не установили GL_SPOT_CUTOFF и GL_SPOT_EXPONENT?

По тому, как вы установили свет и камеру, я думаю, что вы 'Пытаемся осветить прожектор с позиции зрителя.Одна вещь, на которую нужно обратить внимание, это то, что параметры позиционного / направленного освещения (т.е. GL_POSITION и GL_SPOT_DIRECTION) хранятся в пространстве глаза, что означает, что они преобразуются в значение матрицы просмотра модели во время вызоваglLightfv, и это преобразованное значение сохраняется, а не указанное вами.Похоже, вы не настраиваете матрицу вида модели, пока не начнете рисовать, поэтому свет может быть не там, где вы думаете.

Тем не менее, если вы пытаетесь зажечь прожектор, вы, вероятно,лучше попытаться применить форму прожектора, используя другую текстуру, а не с помощью вычислений освещения с фиксированной функцией, которые полагаются на тесселяцию вашей геометрии и не дают вам такой гибкости, чтобы определить форму вашей подсветки.Выбранное вами значение отсечки довольно небольшое, что может привести к тому, что прожектор полностью пропустит ваши вершины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...