<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[für VBO offset berechnen]]></title><description><![CDATA[<p>Ich habe bisher immer eine Klasse gehabt in der die Koordinaten über 3 floats gespeichert wurden. In etwa so wie hier:</p>
<pre><code class="language-cpp">struct coord {
  float x;
  float y;
  float z;
}
</code></pre>
<p>Diese Coords habe ich dann in eine Klasse gespeichert, die einen Vertex beschreiben sollte. Nun ist das Problem, dass ich ne Klasse für Vektoren geschrieben habe, die die Coords in eine std::vector&lt;float&gt; speichert.</p>
<p>Bisher habe ich den Pointer so gesetzt:</p>
<pre><code class="language-cpp">std::cout&lt;&lt;&quot;diff &quot;&lt;&lt;sizeof(Vertex)&lt;&lt;&quot; &quot;&lt;&lt;vertices[0].m_vTanSpaceLight.GetArray()&lt;&lt;&quot; &quot;&lt;&lt;vertices[1].m_vTanSpaceLight.GetArray()&lt;&lt;std::endl;  // 84, adresse, adresse+84 ist die ausgabe

	glVertexPointer(3, GL_FLOAT, sizeof(Vertex), vertices[0].m_vPosition.GetArray() );
</code></pre>
<p>GetArray liefert entweder die adresse des ersten std::vector elementes oder die adresse der obigen struct.</p>
<p>Wenn ich jedoch meine neue vectorklasse benutze, klappt das nicht. Die ausgabe von sizeof ist dann 144, die beiden speicheradressen liegen jedoch nur 120 bytes auseinander. beide offsets werden auch falsch gerendert. Wie kann das sein?!</p>
<p>Was ich ausschließen kann, ist, dass in der Vectorklasse falsche Daten stehen, bisher benutze ich noch eine Wrapperklasse, die in so eine structform konvertiert, aber leider ist das 3x langsamer.</p>
<p>was mich vor allem wundert, ist, dass die errechnete offset nicht funktioniert. wenn die speicherbereiche 120 bytes auseinanderstehen muss das funktionieren, auch wenn sizeof spinnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/234682/für-vbo-offset-berechnen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 08:45:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/234682.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 20 Feb 2009 20:59:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to für VBO offset berechnen on Fri, 20 Feb 2009 21:00:52 GMT]]></title><description><![CDATA[<p>Ich habe bisher immer eine Klasse gehabt in der die Koordinaten über 3 floats gespeichert wurden. In etwa so wie hier:</p>
<pre><code class="language-cpp">struct coord {
  float x;
  float y;
  float z;
}
</code></pre>
<p>Diese Coords habe ich dann in eine Klasse gespeichert, die einen Vertex beschreiben sollte. Nun ist das Problem, dass ich ne Klasse für Vektoren geschrieben habe, die die Coords in eine std::vector&lt;float&gt; speichert.</p>
<p>Bisher habe ich den Pointer so gesetzt:</p>
<pre><code class="language-cpp">std::cout&lt;&lt;&quot;diff &quot;&lt;&lt;sizeof(Vertex)&lt;&lt;&quot; &quot;&lt;&lt;vertices[0].m_vTanSpaceLight.GetArray()&lt;&lt;&quot; &quot;&lt;&lt;vertices[1].m_vTanSpaceLight.GetArray()&lt;&lt;std::endl;  // 84, adresse, adresse+84 ist die ausgabe

	glVertexPointer(3, GL_FLOAT, sizeof(Vertex), vertices[0].m_vPosition.GetArray() );
</code></pre>
<p>GetArray liefert entweder die adresse des ersten std::vector elementes oder die adresse der obigen struct.</p>
<p>Wenn ich jedoch meine neue vectorklasse benutze, klappt das nicht. Die ausgabe von sizeof ist dann 144, die beiden speicheradressen liegen jedoch nur 120 bytes auseinander. beide offsets werden auch falsch gerendert. Wie kann das sein?!</p>
<p>Was ich ausschließen kann, ist, dass in der Vectorklasse falsche Daten stehen, bisher benutze ich noch eine Wrapperklasse, die in so eine structform konvertiert, aber leider ist das 3x langsamer.</p>
<p>was mich vor allem wundert, ist, dass die errechnete offset nicht funktioniert. wenn die speicherbereiche 120 bytes auseinanderstehen muss das funktionieren, auch wenn sizeof spinnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667341</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Fri, 20 Feb 2009 21:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Fri, 20 Feb 2009 21:13:50 GMT]]></title><description><![CDATA[<p>padding und allignment sind dein problem.</p>
<p>VS: #pragma pack<br />
GCC: __attribute__((packed))</p>
<p>google <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667342</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Fri, 20 Feb 2009 21:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 00:58:11 GMT]]></title><description><![CDATA[<p>hmm, ich versuch das mal zu verstehen, und poste mal meine wichtigen deklarationen:</p>
<pre><code class="language-cpp">class Vector {
public:
	Vector();

// member, operatoren etc

	std::vector&lt;float&gt; m_vData;
};
</code></pre>
<pre><code class="language-cpp">class Vec3 : public Vector {
// usw, keine membervariablen
</code></pre>
<pre><code class="language-cpp">class Vertex {
public:
	Vec3 m_vPosition;					// cartesian coordinates
	ColorRGBA m_cColor;					// color (RGBA)
	TexCoord m_fTexCoord;				// glTexCoord2f Textur coordinate (s, t)

	Vec3 m_sTangent, m_tTangent;		// tangents
	Vec3 m_vNormal;					// normals for lightening

	Vec3 m_vTanSpaceLight;				// tangent for light source
</code></pre>
<p>Ich habe mir überlegt gehabt, dass ein in der größe variabler vector ganz nett ist und dann allgemeingültige funktionalität in die klasse gepackt. der vector Vec3 leitet sich davon ab und initialisiert das std::vector array mit platz für 3 floats.</p>
<p>jetzt habe ich nochmal die größe gemessen. Vec3 ist 12 bytes groß.<br />
Die klasse Vertex ist 84 bytes groß und dass kommt auch irgendwie hin, denke ich.<br />
aber nun liegt der laut meiner ausgabe</p>
<pre><code>&amp;vertices[0].m_vPosition.m_vData[0]&lt;&lt;&quot; &quot;&lt;&lt;&amp;vertices&lsqb;&lsqb;b]2[/b&rsqb;&rsqb;.m_vPosition.m_vData&lsqb;&lsqb;b]0[/b&rsqb;&rsqb;
</code></pre>
<p>240 bytes auseinander (0x81f4e88 0x81f4f78); bzw 120 wenn ich direkt benachbarte vertices nehme.</p>
<p>wie ist das möglich, dass der abstand der floats im array weiter als 84 ist? ich habe etwas über padding gelesen, und dass man füllbytes damit aufheben kann, oder vermutlich bytes einfügen kann. aber bin mir nicht sicher wie ich das hier verwenden könnte, weil ich die böse ahnung habe, dass die daten irgendwo im speicher verstreut liegen könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667393</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Sat, 21 Feb 2009 00:58:11 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 08:34:51 GMT]]></title><description><![CDATA[<p>Deine Vec3 halt ich irgendwie für etwas gewagt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667440</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 21 Feb 2009 08:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 12:42:21 GMT]]></title><description><![CDATA[<p>warum?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667513</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Sat, 21 Feb 2009 12:42:21 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 12:45:32 GMT]]></title><description><![CDATA[<p>Ich weiß nicht wie du die Daten in den Puffer bekommst... Aber zumindest sizeof( Vec3 ) liefert die wahrscheinlich nicht das was du gern hättest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667517</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 21 Feb 2009 12:45:32 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 16:43:36 GMT]]></title><description><![CDATA[<p>ja, das gefühl habe ich auch, aber ich weis nicht genau warum.<br />
und die daten gehen entweder über konstruktor oder über set-funktion in das array.<br />
nur, weis ich nicht wie sich das mit einer abgeleiteten klasse verhält. ich vermute, dass die klasse vec3 intern einfach ein objekt vom std::vector erzeugt, genau wies in der vector klasse definiert ist.<br />
nur erklärt, dass nicht das merkwürdige verhalten. vielleicht sollte ich einfach auf so eine coole vectorklasse verzichten, aber dass kann doch nicht die lösung sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667649</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Sat, 21 Feb 2009 16:43:36 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 17:50:50 GMT]]></title><description><![CDATA[<p>Wenn du sizeof auf ein std::vector anwendest bekommst du natürlich die Größe des Objekts zurück, und nicht die größe des verwalteten Speichers...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667686</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sat, 21 Feb 2009 17:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 18:09:13 GMT]]></title><description><![CDATA[<p>ich weis, aber die 120 die ich aus den speicheradressen habe müsste uneingeschränkt richtig sein, weil ich an dieser speicheradresse auf die array-daten zugreifen kann.</p>
<p>da ein rendern über forschleife und opengl primitien funktioniert, aber über v-arrays nicht, kann es also nur sein, dass irgendwann die elemente nicht mehr 120 bytes entfernt sind. irgendwas läuft da mit meinem compiler mächtig schief habe ich zumindest im gefühl.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667702</guid><dc:creator><![CDATA[gentoo]]></dc:creator><pubDate>Sat, 21 Feb 2009 18:09:13 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 21:16:07 GMT]]></title><description><![CDATA[<p>um es nochmal deutlicher zu sagen:<br />
in Vec3 und in std::vector sind deine daten nicht!<br />
das ist lediglisch eine klasse deren implementierung du scheinbar absolut nicht kennst und auf gut glueck davon ableitest.<br />
das ableiten an sich ist nicht schlimm, aber da es eine blackbox ist, darfst du keine schlussfolgerungen ueber deren aufbau machen.</p>
<p>aber ich glaube damit oeffnet sich erst die buechse der grundlagen-pandora fuer dich, deswegen -&gt; verschoben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667807</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Sat, 21 Feb 2009 21:16:07 GMT</pubDate></item><item><title><![CDATA[Reply to für VBO offset berechnen on Sat, 21 Feb 2009 21:16:16 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-5577.html" rel="nofollow">rapso</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html" rel="nofollow">Spiele-/Grafikprogrammierung</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1667808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1667808</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Sat, 21 Feb 2009 21:16:16 GMT</pubDate></item></channel></rss>