Как наложить текстуру на модель?

317
16 февраля 2018, 19:02

Считал файл name.TIF с изображением и поместил его в буфер для изображения:

  public static ByteBuffer loadTexture(String path) {
        BufferedImage image = null;
        try {
            InputStream in = new FileInputStream(path);
            image = ImageIO.read(in);
        } catch (IOException ex) {
            throw new RuntimeException("Failed to load a texture file!"
                    + System.lineSeparator() + ex.getMessage());
        }
        if (image != null) {
            AffineTransform transform = AffineTransform.getScaleInstance(1f, -1f);
            transform.translate(0, -image.getHeight());
            AffineTransformOp operation = new AffineTransformOp(transform,
                    AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
            image = operation.filter(image, null);
            int width = image.getWidth();
            int height = image.getHeight();
            int[] pixels = new int[width * height];
            image.getRGB(0, 0, width, height, pixels, 0, width);
            ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * 4);
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    int pixel = pixels[y * width + x];
                    buffer.put((byte) ((pixel >> 16) & 0xFF));
                    buffer.put((byte) ((pixel >> 8) & 0xFF));
                    buffer.put((byte) (pixel & 0xFF));
                    buffer.put((byte) ((pixel >> 24) & 0xFF));
                }
            }
            buffer.flip();
            return buffer;
        } else {
            throw new RuntimeException("File extension not supported!"
                    + System.lineSeparator() + "The following file extensions "
                    + "are supported: "
                    + Arrays.toString(ImageIO.getReaderFileSuffixes()));
        }
    }

Класс, отвечающий за рендеринг модели(максимально сократил), строит по треугольникам модель из obj файла:

    private final int vaoTriangles;
    private final int shaderProgram;
    private ObjModel objModel;//модель обж файла
    SceneRenderer(ObjModel objModel) throws Exception {
        this.objModel = objModel;
        glEnable(GL_DEPTH_TEST);
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glPointSize(10);
        String fragmentSource = IOUtils.toString(getClass().getResourceAsStream("shader.frag"));
        String vertexSource = IOUtils.toString(getClass().getResourceAsStream("shader.vert"));
        shaderProgram = Util.createShaderProgram(vertexSource, fragmentSource);
        int vertexBuffer = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, Geometry.objFileObject(objModel).rewind(), GL_STATIC_DRAW);
        int normalBuffer = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
        glBufferData(GL_ARRAY_BUFFER, Geometry.getNormals(objModel).rewind(), GL_STATIC_DRAW);

        vaoTriangles = glGenVertexArrays();
        glBindVertexArray(vaoTriangles);
        glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
        glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, false, 0, 0);
        glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
        glVertexAttribPointer(normalLocation, 3, GL_FLOAT, false, 0, 0)
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    }
    void render() throws Exception {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
        FloatBuffer vMatrix = BufferUtils.createFloatBuffer(16);
        new Matrix4f()
                .lookAt(cameraPosition.x, cameraPosition.y, cameraPosition.z,
                        0.0f, 0.0f, 0.0f,
                        0.0f, 1.0f, 0.0f).get(vMatrix);
        FloatBuffer mMatrix = BufferUtils.createFloatBuffer(16);
        new Matrix4f().translate(modelPosition)
                .rotateX(modelRotation.x)
                .rotateY(modelRotation.y)
                .rotateZ(modelRotation.z)
                .get(mMatrix);
        glUseProgram(shaderProgram);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "P"), false, pMatrix);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "V"), false, vMatrix);
        glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "M"), false, mMatrix);
        glUniform3f(glGetUniformLocation(shaderProgram, "light_worldspace"), lightPosition.x, lightPosition.y, lightPosition.z);
        glBindVertexArray(vaoTriangles);
        glEnableVertexAttribArray(vertexLocation);
        glEnableVertexAttribArray(normalLocation);
        glDrawArrays(GL_TRIANGLES, 0, objModel.getIdx().size());
    }
}

Ну и фрагментный шейдер, в котором происходит заливка цвета:

#version 330 core
in vec3 normal_modelspace;
in vec3 vertex_modelspace;
out vec3 color;
uniform vec3 light_worldspace;
void main() {
  vec3 n = normalize(normal_modelspace);
  vec3 l = normalize(light_worldspace - vertex_modelspace);
  float cosTheta = clamp( dot( n, l), 0,1 );
  float ambient = 0.05;
  color = vec3(0.0,1.0,0.0) * (cosTheta + ambient);
}
READ ALSO
Получение данных серверов методом POST

Получение данных серверов методом POST

Пишу веб-сервер на Java (не используя сервлет и тп

255
Обновить JAVA_HOME Ubuntu 16.04

Обновить JAVA_HOME Ubuntu 16.04

Сделал downgrade Java 9 to Java 8Системные переменные не обновились полностью

266
junit тест с Mockito и PowerMockito

junit тест с Mockito и PowerMockito

Нужно ли проверять вызов исключения путем замены локальной переменной File

335
ArrayList&lt;String&gt; наполнять пока не остановят

ArrayList<String> наполнять пока не остановят

Наполняю список с клавиатуры пока не введу специальное слово, потом вывожу все слова на экран кроме последнего

260