2017-10-13 2 views
0

Wenn mein Verständnis stimmt, hat eine Textureinheit eine Anzahl von Zielen (GL_TEXTURE_2D etc.), an die ich Texturen binden kann. Ich kann die aktuell aktive Textureinheit mit glActiveTexture ändern. Wenn ich glBindTexture aufrufen, binde ich das angegebene Texturobjekt an das angegebene Ziel der gerade aktiven Textureinheit, richtig?Ist es ausreichend, glActiveTexture aufzurufen, um eine Textur zu bearbeiten, nachdem sie bereits gebunden wurde?

Wenn ich später die Parameter einer Textur ändern oder eine Funktion wie glTexSubImage2D aufrufen möchte, ist es ausreichend, glActiveTexture mit der Textureinheit aufzurufen, an die meine Textur gebunden ist? Oder muss ich jedes Mal glBindTexture aufrufen, auch wenn die Textur bereits an eine Einheit gebunden ist?

Antwort

2

Solange Sie wissen, welcher Status an welche Einheit gebunden ist, können Sie sich darauf verlassen, dass Sie einfach glActiveTexture ändern, um zur richtigen Einheit zu wechseln, um sie zu finden.

Sie sollten sich jedoch nicht für diesen Zweck darauf verlassen. Nicht, weil OpenGL unzuverlässig ist, sondern weil Sie falsch über das sind, was Sie denken, dass Sie an welche Einheit gebunden haben.

Darüber hinaus verwischt es die Grenze zwischen dem Binden einer Textur, um damit zu rendern und binden Sie eine Textur an Modifizieren es. Sie möchten, dass die beiden vollständig getrennt sind. Erstens, weil das Ändern des Status einer Textur in der Rendering-Schleife (wo du sie bindest, um sie zu modifizieren) schlecht ist und wahrscheinlich langsam ist. Und zweitens, wenn es darum geht, GL 4.5 und DSA zu übernehmen, können Sie dies schnell und effizient tun.

0

Sie können sich Textureinheit als auf der GPU vorhandene Pipes vorstellen. Es gibt viele solcher Textureinheiten auf der GPU. Mit dem Aufruf von glActivateTexture() sagst du dem OpenGL-Treiber, dass er der GPU sagt, welche Textur ich als nächstes binden werde. Verbinde ihn in der erwähnten Textureinheit. Wenn du glBindTexture() sagst, sagst du dem Treiber, was auch immer ich gerade mache es auf der Textur, die ich gebunden habe. Sobald Sie glTextureImage2D aufrufen, befindet sich Ihre Textur im Treiberspeicher und Sie haben keinen direkten Zugriff darauf. So hat der Treiber Ihnen das Texturobjekt übergeben, das Sie binden und dem Treiber mitteilen, über welche Ressource ich rede.

Also wenn Sie immer machen Sie es immer gut zu tun beide Textureinheit zu aktivieren und binden Sie dann Ihre Textur. Wie Sie es vorher getan haben, wird die Textur automatisch an die Einheit gebunden, die Sie angegeben haben.

Wenn Sie Textureinheit nicht standardmäßig angeben, wird GL_TEXTURE0 verwendet und daher kann es manchmal verwirrend sein.

Hoffe, das hilft.

Verwandte Themen