Видима ли сущность?

Версия Minecraft
1.7.10

tox1cozZ

aka Agravaine
8,455
598
2,892
Нужно проверить видит ли игрок сущность, то бишь есть на она на экране и не заграждают ли ее блоки.
Пробовал так - не пашет:
Java:
EntityLivingBase cameraEntity = mc.renderViewEntity;
            Vec3 renderingVector = cameraEntity.getPosition(e.partialTicks);
            Frustrum frustrum = new Frustrum();

            double viewX = cameraEntity.lastTickPosX + (cameraEntity.posX - cameraEntity.lastTickPosX) * e.partialTicks;
            double viewY = cameraEntity.lastTickPosY + (cameraEntity.posY - cameraEntity.lastTickPosY) * e.partialTicks;
            double viewZ = cameraEntity.lastTickPosZ + (cameraEntity.posZ - cameraEntity.lastTickPosZ) * e.partialTicks;
            frustrum.setPosition(viewX, viewY, viewZ);
           
            if(myEntity.isInRangeToRenderVec3D(renderingVector) && frustrum.isBoundingBoxInFrustum(myEntity.boundingBox)){
                // In camera
            }
 
Решение
Для этого есть QueryObject.
Создаешь где-то QueryObject: handle = GL15.glGenQueries().
Перед рендером объекта вызываешь glBeginQuery(SAMPLES_PASSED, handle).
После рендера: glEndQuery(SAMPLES_PASSED).

Теперь нужно достать результат. Можно достать его сразу, но этого делать нельзя. Дело в том, команды на ГПУ вызываются не сразу после их вызова с ЦПУ, а через какое-то время. Поэтому, если вызвать что-то типа glGetQueryObjecti64(handle, GL_QUERY_RESULT), результат получишь. Но на самом деле ЦПУ стопнется в ожидании ответа от ГПУ, т.е. снизится производительность. Поэтому нужно сначала спросить, а доступен ли результат: glGetQueryObjecti(handle, GL_QUERY_RESULT_AVAILABLE) != 0 и если доступен, то можно...
2,505
81
397
Для этого есть QueryObject.
Создаешь где-то QueryObject: handle = GL15.glGenQueries().
Перед рендером объекта вызываешь glBeginQuery(SAMPLES_PASSED, handle).
После рендера: glEndQuery(SAMPLES_PASSED).

Теперь нужно достать результат. Можно достать его сразу, но этого делать нельзя. Дело в том, команды на ГПУ вызываются не сразу после их вызова с ЦПУ, а через какое-то время. Поэтому, если вызвать что-то типа glGetQueryObjecti64(handle, GL_QUERY_RESULT), результат получишь. Но на самом деле ЦПУ стопнется в ожидании ответа от ГПУ, т.е. снизится производительность. Поэтому нужно сначала спросить, а доступен ли результат: glGetQueryObjecti(handle, GL_QUERY_RESULT_AVAILABLE) != 0 и если доступен, то можно вызывать glGetQueryObjecti64(handle, GL_QUERY_RESULT). При этом, если результат не доступен, то стоит использовать значения видимости с предыдущего кадра, а glBeginQuery-glEndQuery при этом вызывать не нужно. Таким образом, результат видимости будет известен как бы со второго тика, а сам OcclusionQuery выполняться каждый второй кадр. И естестенно, для каждого проверяемого объекта должен быть заведен свой QueryObject.

Еще немного про OcclusionQuery. Если тебе надо узнать, нужно ли рендерить объект, то перед главным объектом рендерится примитивный параллепипед без записи в буферы цвета и глубины. И если он виден, то рендерится главный объект. Но на самом деле, от этого есть профит только при рендере чанков.
 
7,099
324
1,510
Поэтому нужно сначала спросить, а доступен ли результат: glGetQueryObjecti(handle, GL_QUERY_RESULT_AVAILABLE) != 0 и если доступен, то можно вызывать glGetQueryObjecti64(handle, GL_QUERY_RESULT)
Можно просто использовать футуры
 
Сверху