Well, after some experimentation, I decided to solve the problem.
gl_Position = projviewMatrix * vec4(ivec3(in_Position - camera), 1.0);
camera is uniform uvec3 , and in_Position is the input of uvec3 position. Translation is performed as a separate operation, while scaling, rotation and projection of a view are performed using mat4 floats ( projviewMatrix ), as usual.
Care must be taken to ensure the correct input types and commands ( glVertexAttribIPointer ). OpenGL, it seems, really wants to quit swimming, but leave the data in an integer type, so any small error will lead to distortion of the input.
It is simply not possible to perform projviewMatrix multiplication at a fixed point, since you do not have access to the intermediate 64-bit storage for multiplication. Only if the bits used by in_Position and projviewMatrix up to 32 will be close to usability, but considering that the rendering cords will be so close to the original and no additional options will be received (still need to be changed after multiplication, the GPU will take so much same time as for float as int), there is no reason to perform fixed-point arithmetic after the position has been focused by the camera.
Of course, this ignores royal pain in order to actually manipulate integer position data. I would not recommend it.
source share