GLSL 1.50, openGL 3.3.변형 피드백 (OpenGL)의 전체 설정
저는 최근에 tranform 피드백을 얻으려고했지만 성공하지 못했습니다. glBeginTranformFeedback()을 수행 한 후에도 오류가 발생하며 전체 작업 코드를 찾지 못해서 필자가 발견 한 일부 코드와 설명서를 가지고 지식을 쌓아 봤지만 지금은 잘 작동하고 있지만 뭔가 빠져 있습니다. 그래서 누군가가 완전한 코드 (버퍼 초기화, 설정, 업데이트, 렌더링, 다시 읽기)를 얻으면 확실하게 도움이 될 것이고 만약에 당신이 무슨 일이 일어나고 있는지 알면 내 코드를 볼 수있을 것입니다. 나는 약간의 벤치마킹을 제외 창문의 취급과 창조의 : 단지 GLSL의 optimalization에 대한이 높이 요
#version 150 core
in vec3 speed;
varying vec3 sp;
const float gravity_constant = 9.81f;
void main(){
sp = speed;
sp += vec3(0,-gravity_constant,0);
}
파편
#version 150 core
varying vec3 sp;
void main (void)
{
vec3 c = sp;
gl_FragColor = vec4(c,1.0);
}
조각 쉐이더 :
int main()
{
bool fullsize = false, paused = false;
std::string caption = "Tester";
GLuint dataVAO,speedUpdateVBO,dataVBO;
std::vector<vector3f> dataW;
// Create the main rendering window
init(); //just some camera commands
UniShader shader; //my shader class keeps everything together
shader.init();
shader.addShader("test.vert");
shader.addShader("test.frag");
shader.newAttributeVariable("speed");
shader.newFeedbackVarying("sp");
shader.linkShader();
shader.use();
//init some data
dataW.push_back(vector3f(0,1,0));
//creating VAO
glGenVertexArrays(1,&dataVAO);
glBindVertexArray(dataVAO);
//creating VBO
glGenBuffers(1,&dataVBO);
glBindBuffer(GL_ARRAY_BUFFER,dataVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f), 0, GL_DYNAMIC_DRAW);
glVertexAttribPointer(shader.getAttributeIndex("speed"), 3, GL_FLOAT, GL_FALSE, 0, 0);
glGenBuffers(1, &speedUpdateVBO);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO);
glBindVertexArray(0);
while (App.IsOpened())
{
App.SetActive();
benchP = Clock.GetElapsedTime();
//update calls
if(!paused)
//update
benchU = Clock.GetElapsedTime();
//render calls
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.6f,0.7f,0.7f);
GLuint query;
GLuint count = 0;
glGenQueries(1, &query);
glEnableVertexAttribArray(shader.getAttributeIndex("speed"));
glBindVertexArray(dataVAO);
glBindBuffer(GL_ARRAY_BUFFER,dataVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vector3f)*dataW.size(), &dataW[0], GL_DYNAMIC_DRAW);
glBindBuffer(GL_TRANSFORM_FEEDBACK_BUFFER, speedUpdateVBO);
glBufferData(GL_TRANSFORM_FEEDBACK_BUFFER, sizeof(vector3f)*dataW.size(), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, speedUpdateVBO);
glEnable(GL_RASTERIZER_DISCARD);
glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
printOglError(); //Until this everything OK, I think
glBeginTransformFeedback(GL_POINTS);
printOglError(); //This one prints out Invalid Value
glDrawArrays(GL_POINTS,0,dataW.size());
glEndTransformFeedback();
glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
glDisable(GL_RASTERIZER_DISCARD);
//retrieve updated data
glGetQueryObjectuiv(query, GL_QUERY_RESULT, &count); //count is 0 -> nothing happend
glBindVertexArray(0);
glDisableVertexAttribArray(shader.getAttributeIndex("speed"));
glDeleteQueries(1, &query);
App.Display();
//some other benchmark stuff
}
쉐이더. sp가 사용되지 않으면 GLSL이이를 지울 것입니다. 여러 개의 변형이있는 훨씬 큰 코드에서이 코드를 추출 할 때 약간의 사소한 버그가있을 수 있습니다.
셰이더 클래스 구현을 게시 할 수 있습니까? 또한 어떤 플랫폼을 실행 중인지, 드라이버 버전은 무엇인지 알려주십시오. – kvark
실험을 반복하되 프래그먼트 쉐이더가 프로그램에 첨부되지 않았 으면 좋겠습니까 (정점 만)? GLSL 컴파일러에 의해 최적화 된'sp' 값에 대해서는 걱정하지 마십시오. (나는 FP 컴포넌트가 붙지 않은 TF 쉐이더를 가지고 있습니다.) – kvark
글쎄, 나는 샘플 팩이 모든 것을 쉽고 간단하게 처리 할 수 있기 때문에 실제로 그 점을 이해할 수 있다고 생각한다. 하지만 누군가가 나를 돕는 것보다 더 많은 것을 요구할 수는 없다. 셰이더 클래스가 편집 중이며, 윈도우 7, ATI radeon 3870HD에서 실행 중이다. OpenGL 버전 6.14.10.9901 (arround 3.3)과 함께 Catalyst Control Center 10.6. 조각 쉐이더를 "void main() {}"으로 지우면 같은 오류가 발생합니다. 로드에서 셰이더를 제외하면 같은 오류가 발생합니다 .. – Raven