Hi,
eventuell kannst du von Instanzing profitieren. Das könntest du ganz gut mit anderen Techniken verbinden. Du könntest z.B. deine Daten in Chunks aufteilen (ggf in einen Octree sortieren o.Ä.). Dann können viele der Chunks schonmal verworfen werden, indem du gegen das Viewfrustum testest. Den Rest der Daten kannst du instanziiert rendern, d.h. du hast im Idealfall nur einen Drawcall für alle Blöcke in deinem Chunk.
Ohne zu wissen wo wirklich das Bottleneck bei dir liegt würde ich stark darauf tippen das du CPU bound bist. Vor allem wenn du die 300k Blöcke mit 300k Drawcalls renderst ist der CPU Overhead extrem. Die GPU wird sich vermutlich nicht besonders stark für die Datenmenge interessieren. Also solltest du dringend dort ansetzen (wie gesagt, ohne zu wissen wo das tatsächliche Bottleneck liegt). Am besten wäre es natürlich wenn du dein Programm erstmal profilest um gezielter zu optimieren.
Der Befehl muss von der CPU zur GPU gehen, die muss ihre Daten vorbereiten, dann die Vertexe verarbeiten und alle Pixel zeichnen. Größere Texturen können vermutlich das Zeichnen der Pixel etwas langsamer machen, aber den Rest der Zeit beeinflussen sie halt nicht.
So in etwa funktioniert das!
Auf jedenfall sollte @2310 Mipmaps verwenden um cache trashing zu vermeiden. Außerdem könnte man sich die Pixeldensity genauer betrachten und ggf die Auflösung von den Texturen tatsächlich vermindern.