提示コード、上がcpu描画で提示画像の緑です。下がシェーダー描画で青です。なぜ同じラジアン度で同じ量回転しているのにも関わらず
なぜ回転で誤差が出て線の大きさが変わるのでしょか?提示コードのコメント部内部のコードです。
###試したこと
######すべての型をfloat型しました。
######ラジアンを0,0で線の大きさを確認 同じ大きさでした。
######ラジアン度を固定で度数とラジアンを画面に表示
cpp
1 2 FrameWork::DrawLine(glm::vec2(900, 200), glm::vec2(1000, 200), 7, d, glm::vec4(0, 100, 0, 255)); 3 line->Draw(glm::vec2(900, 200), glm::vec2(1000, 200), 7, d, glm::vec4(0, 100, 255, 255)); 4 d += PI / 180;
// ##################################### 線 描画 ##################################### void DrawLine(glm::vec2 start,glm::vec2 end, GLfloat width,float r, glm::vec4 color) { color = FrameWork::GetGlColor(color); glColor4f(color.x, color.y,color.z, color.w); start = getWindowPosition(start); end = getWindowPosition(end); glm::vec2 size = glm::abs(end - start) / 2.0f; //width の最大値と最小値を得る GLfloat lineWidthRange[2] = { 0.0f, 0.0f }; glGetFloatv(GL_ALIASED_LINE_WIDTH_RANGE, lineWidthRange); if (width > lineWidthRange[1]) { std::cerr << "glLineWidth();の最大値を超えました。" << std::endl; width = lineWidthRange[2]; } else if (width < lineWidthRange[0]) { std::cerr << "glLineWidth();の最小値を超えました。" << std::endl; width = lineWidthRange[0]; } float dx = 1.0f / (FrameWork::getWindowContext()->getSize().x / 2); float dy = 1.0f / (FrameWork::getWindowContext()->getSize().y / 2); ///////////////////////////////////////////////////////////////////////////////////////////////// glPushMatrix(); { glMatrixMode(GL_MODELVIEW); glTranslated(start.x + size.x, start.y - size.y, 0); glRotated(FrameWork::GetAngle(r), 0, 0, -1); glLineWidth(width); //太さ glBegin(GL_LINES); { glVertex2f(-size.x, size.y); glVertex2f(size.x, -size.y); } glEnd(); glFinish(); } glPopMatrix(); //////////////////////////////////////////////////////////////////////////////////////////////// }
cpp
1void FrameWork::Line::Draw(glm::vec2 start, glm::vec2 end,unsigned short width, float r, glm::vec4 color) 2{ 3 if (isDefaultShader == TRUE) 4 { 5 shader->setEnable(); 6 } 7 8 glBindVertexArray(vao); 9 glBindBuffer(GL_ARRAY_BUFFER, vbo); 10 11 12 13 14 //Transform 15 glm::vec2 size = glm::abs(end - start) / 2.0f; 16 17 vertex[0].position[0] = -size.x; 18 vertex[0].position[1] = -size.y; 19 20 vertex[1].position[0] = +size.x; 21 vertex[1].position[1] = +size.y; 22 23 glBufferSubData(GL_ARRAY_BUFFER, 0, 2 * sizeof(Vertex), &vertex); 24//////////////////////////////////////////////////////////////////////////////////////////////////////////// 25 setTranslate(glm::vec3(start.x + size.x, start.y + size.y, 0.0f)); //平行移動 26 27 setRotate(r); //回転 28 glLineWidth(width); //太さ 29/////////////////////////////////////////////////////////////////////////////////////////////////////////// 30 //Uniform 31 shader->setUniform4f("uFragment", FrameWork::GetGlColor(color)); 32 shader->setUniformMatrix4fv("uTranslate", translate); 33 shader->setUniformMatrix4fv("uRotate", rotate); 34 shader->setUniformMatrix4fv("uScale", scale); 35 shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::getWindowContext()->getSize().x, FrameWork::getWindowContext()->getSize().y, 0.0f, -1.0f, 1.0f)); 36 37 glDrawArrays(GL_LINES, 0, 2); 38 39 glBindVertexArray(0); 40 glBindBuffer(GL_ARRAY_BUFFER, 0); 41 42 if (isDefaultShader == TRUE) 43 { 44 shader->setDisable(); 45 } 46}
あなたの回答
tips
プレビュー