2014-11-14 3 views
0

У меня возникли проблемы с хранением координат точек текстуры в VBO, а затем с помощью OpenGL использовать его, когда пришло время рендеринга. В приведенном ниже коде, то, что я должен получать, - это хорошая текстура 16x16 на квадрате, которую я делаю с помощью квадрациклов. Однако то, что я получаю, это первый верхний левый пиксель изображения, а красный, поэтому я получаю большой красный квадрат. Пожалуйста, расскажите мне, что я делаю неправильно, очень подробно.texCoordPointer не работает в lwjgl

public void start() { 
    try { 
     Display.setDisplayMode(new DisplayMode(800,600)); 
     Display.create(); 
    } catch (LWJGLException e) { 
     e.printStackTrace(); 
     System.exit(0); 
    } 

    // init OpenGL 
    GL11.glMatrixMode(GL11.GL_PROJECTION); 
    GL11.glLoadIdentity(); 
    GL11.glOrtho(0, 800, 0, 600, 1, -1); 
    GL11.glMatrixMode(GL11.GL_MODELVIEW); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 

    glLoadIdentity(); 

    //loadTextures(); 
    TextureManager.init(); 

    makeCube(); 

    // init OpenGL here 

    while (!Display.isCloseRequested()) { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
     // render OpenGL here 
     renderCube(); 

     Display.update(); 
    } 

    Display.destroy(); 
} 

public static void main(String[] argv) { 
    Screen screen = new Screen(); 
    screen.start(); 
} 

int cube; 
int texture; 

private void makeCube() { 
    FloatBuffer cubeBuffer; 
    FloatBuffer textureBuffer; 

    //Tried using 0,0,16,0,16,16,0,16 for textureData did not work. 
    float[] textureData = new float[]{ 
      0,0, 
      1,0, 
      1,1, 
      0,1}; 

     textureBuffer = BufferUtils.createFloatBuffer(textureData.length); 
     textureBuffer.put(texture); 
     textureBuffer.flip(); 

     texture = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, texture); 
     glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

     float[] cubeData = new float[]{ 
      /*Front Face*/ 
      100,  100, 
      100 + 200, 100, 
      100 + 200, 100 + 200, 
      100,  100 + 200}; 

     cubeBuffer = BufferUtils.createFloatBuffer(cubeData.length); 
     cubeBuffer.put(cubeData); 
     cubeBuffer.flip(); 

     cube = glGenBuffers(); 
     glBindBuffer(GL_ARRAY_BUFFER, cube); 
     glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_STATIC_DRAW); 
     glBindBuffer(GL_ARRAY_BUFFER, 0); 

} 

private void renderCube(){ 
    TextureManager.texture.bind(); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 

    glBindBuffer(GL_ARRAY_BUFFER, texture); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, cube); 
    glVertexPointer(2, GL_FLOAT, 0, 0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glDrawArrays(GL_QUADS, 0, 4); 
    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

ответ

0

Я считаю, что ваша проблема в аргументе textureBuffer.put() в этом фрагменте кода:

textureBuffer = BufferUtils.createFloatBuffer(textureData.length); 
    textureBuffer.put(texture); 
    textureBuffer.flip(); 

texture является переменной типа int, который даже не был инициализирован еще. Позднее вы используете его как имя буфера. Аргумент должен быть textureData вместо:

textureBuffer.put(textureData); 

Я обычно стараюсь сосредоточиться на функциональности над стилем, отвечая на вопросы здесь, но я не могу помочь ему в этот раз: ИМХО, texture это очень неудачное имя для имени буфера , Это не только вопрос стиля и читаемости. Если вы использовали описательные имена для переменных, вы, скорее всего, сразу заметили бы эту проблему.

Скажите, что вы назвали переменную для имени буфера bufferId (я называю идентификаторы объектов «id», хотя официальная терминология OpenGL - это «имя») и буфер, содержащий координаты текстуры textureCoordBuf. В заявлении идет речь, стало бы тогда:

textureCoordBuf.put(bufferId); 

который выскочит как весьма подозрительный от даже очень поверхностного взгляда на коде.

+0

Вау я чувствую себя настолько глупым ха-ха. Я думаю, каждый раз, когда мой мозг сканировал слово «текстура», я думал, что это мой массив с плавающей точкой. Я должен, вероятно, назвать мои переменные лучше. Большое спасибо, сэр! : D –

Смежные вопросы